Java 反射 - Class
类
在程序运行期间, 系统始终为所有对象维护一个 运行时类型标识. 这个信息会跟踪每个对象所属的类. 虚拟机利用运行时类型信息选择要执行的正确的方法.
Class 类被用于访问这些信息.
Employee e;
...
Class cl = e.getClass();
Class
对象会描述一个特定类的属性.
获得 Class 对象的三种方法
public final native Class<?> getClass();
static Class<?> forName(String className) throws ClassNotFoundException;
Class class = T.Class; // T 为任意的 Java 类型, 也可以是 void
虚拟机为内一个类型管理一个唯一的 class 对象. ==> 可以用 == 运算符实现两个类对象的比较.
class Manager extends Employee { ... }
Employee e = new EMployee();
System.out.println(e.getClass() == Employee.class); //true
与 e instanceof T 不同, 如果 e 是某个子类的实例, 则测试失败.
class Manager extends Employee { ... }
Manager m = new Manager();
Employee e = new Employee();
e instanceof Empolyee; // true
e instanceof Manager; // false
m instanceof Employee; // true
m instanceof Manager; // true
e.getClass() == Employee.class; // true
e.getClass() == Manager.class; // false
// m.getClass() == Employee.class; // 编译不通过
m.getClass() == Manager.class; // true
如果有一个 Class 类型的对象, 可以用 getConstructor()
来获取构造函数, 然后用 getInstance()
方法创建对象.
java.lang.Class :: getConstrutor()
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException;
java.lang.reflect.Constructor :: newInstance()
public T newInstance(Object ... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException;