反射---Class类

2018-10-25  本文已影响0人  爱做梦的严重精神病患者

 能够分析类能力的程序称为反射。反射机制的功能极其强大,反射机制可以用来:

1.Class类

 在程序运行期间Java运行时系统始终为所有的对象维护一个被称为运行时类型标识保存这些运行时信息的类被称作Class类Object类中的getClass()方法将返回一个Class类型的实例
 一个Class对象将表示一个特定的运行时各种信息。最常用的Class方法getName(),这个方法返回类的名字

Employee e = new Employee("YinHang");
System.out.println(e.getClass().getName() + " " + e.getName());
//输出 Employee YinHang

 还可以调用静态方法forName获得类名对应Class对象

String className = "java.util.Random";
Class cl = Class.forName(className);

 除此之外,如果T任意的Java类型(或void关键字),T.class将代表匹配Class类对象

Class cl1 = Random.class;
Class cl2 = int.class;
Class cl3 = Double[].class;

 一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。例如:int不是类,但int.class是一个Class类型的对象Class类实际上是一个泛型类。例如:Employee.class类型Class<Employee>

虚拟机为每个类型管理一个Class对象。因此可以利用"=="运算符实现两个Class类对象比较的操作。(属于同一个类型)

if(e.getClass() == Employee.class)

 还有一个很有用的方法newInstance(),可以用来动态地创建一个类的实例。例如,

e.getClass().newInstance();
Class.forName("java.util.Random").newInstance();
Empolyee.class.newInstance();

 但以上Class.newInstance()方法只能调用无参数的构造器,如果要调用有参数的构造器,需要使用Constructor类中的newInstance(Object...args)方法。其中Obejct...args参数代表构造器所需要的各种参数

e.getClass().getDeclaredConstructor().newInstance(Obejct...args);

总结:

  • Class对象表示某一类型运行时的各种信息
  • 获得Class对象的三种方法:
  1. object.getClass()
  2. Class.forName()
  3. T.class
  • 两个Class对象比较使用"=="运算符即可
  • 动态地创建一个类的实例,使用Constructor类中的newInstance(Object...args)方法。

2.类的加载

Java类的加载编译器.java文件编译.class文件加载到JVM中,在内存中生成Java.lang.class对象
 之所以要加载类是因为JVM不是在项目运行时就把所有的类文件加载到JVM,而是当类需要的的时候才去加载

Class.forName()、new关键字、ClassLoader.loadClass区别

上一篇 下一篇

猜你喜欢

热点阅读