- class(包括interface)的本质是数据类型
- 无继承关系的数据类型无法赋值
- class/interface的数据类型是Class
- 每加载一个class,JVM就为其创建一个Class类型的实例,并关联起来
- JVM持有的每个Class实例都指向一个数据类型(class或interface)
- 一个Class实例包含了该class的完整信息
- Class
- JVM为每个加载的class创建对应的Class实例,并在实例中保存该class的所有信息
- 如果获取了某个Class实例,则可以获取到该实例对应的class的所有信息
- 通过Class实例获取class信息的方法称为反射(Reflection)
- 如何获取一个class的Class实例?
- Type.class Class cls = String.class;
- getClass() String s = "Hello"; Class cls = s.getClass();
- Class.forName() Class cls = Class.forName("java.lang.String");
- Class实例在JVM中是唯一的,因此可以使用==比较两个Class实例
- 。。。一般使用instanceof判断数据类型
- 反射的目的:当获得某个Object实例是,我们可以获取该Object的class信息
- 从Class实例获取class信息
- getName()
- getSingleName()
- getPackage()
- 从Class实例判断class类型
- isInterface()
- isEnum()
- isArray()
- isPrimitive() 判断基本类型
- 创建class实例
- newInstance()
- 利用JVM动态加载Class的特性:
- 可以在运行期根据条件加载不同的实现类
通过反射访问字段:
- Field对象封装了字段的所有信息
- 通过Class实例的方法可以获取Field实例:
- getField/getFields/getDeclaredField/getDeclaredFields
- 通过Field实例可以获取字段信息
- getName/getType/getModifiers
- 通过Field实例可以读取或设置某个对象的字段:
- get(Object instance) / set(Object instance,Object fieldValue)
- 通过设置setAccessible(true)来访问非public字段
通过反射调用方法:
- Method对象包含一个method的所有信息
- getName()
- getReturnType()
- getParameterTypes()
- getModifiers() 返回方法的修饰符
- 调用无参数的Method
-
- Object invoke(Object obj)
- 调用带参数的Method
- Object invoke (Object obj,Object... args)
- 通过设置setAccessible(true)来访问非public方法
通过反射调用构造方法:
- Class.newInstance()只能调用public无参数构造方法
- String s = (String) String.class.newInstance()
- Constructor对象
-
- 包含一个构造方法的所有对象,可以创建一个实例
- Constructor对象封装了构造方法的所有信息
- 通过Class实例的方法可以获取Constructor实例:
- getConstructor / getConstructors / getDeclaredConstructor / getDeclaredConstructors
- 通过Constructor实例可以创建一个实例对象:
- newInstance(Object... parameters)
- 通过设置setAccessible(true)来访问非public构造方法
通过反射获取继承关系:
- 获取父类的Class:
- Class getSuperclass() Class sup = Integer.class.getSuperclass(); //Number.class
- Object的父类是null
- interface的父类是null
- 获取当前类直接实现的interface:
- Class[] getInterfaces()
- 不包括间接实现的interface
- 没有interface的class返回空数组
- interface返回继承的interface
- 通过Class对象可以获取继承关系:
- getSuperclass()
- getInterfaces()
- 通过Class对象的isAssignableFrom()方法可以判断一个向上转型是否正确