反射是指程序在运行期可以拿到一个对象的所有信息。
Class类
JVM为每个加载的类和接口创建了对应的 Class 实例来保存类和接口的所有信息,获取一个类对应的 Class 实例后,就可以获取该类的所有信息,这种通过 Class 实例获取类信息的方法称为反射(Reflection)。
获取类的 Class 实例方法:
- 通过类的静态变量class获取
- 通过该实例变量提供的getClass()方法获取
- 通过静态方法Class.forName()获取
Class<?> clazz = MyObject.class;
Class<?> clazz = new MyObject().getClass();
Class<?> clazz = Class.forName("com.example.MyObject");
访问字段
获取字段:
- Field getField(name) //根据字段名获取某个public的field(包括父类)
- Field getDeclaredField(name) //根据字段名获取类自身的某个field(不包括父类)
- Field[] getFields() //获取所有public的field(包括父类)
- Field[] getDeclaredFields() //获取类自身的所有field(不包括父类)
一个 Field 对象包含了一个字段的所有信息:
- String getName() //返回字段名称
- Class<?> getType() //返回字段类型,是一个Class实例
- int getModifiers() //返回字段的修饰符,是一个int,不同的bit表示不同的含义。
获取字段值:
Field.get(Object) //获取指定实例的指定字段的值
设置字段值:
Field.set(Object, Object) //第一个Object参数是指定的实例,第二个Object参数是待修改的值
调用方法
获取方法:
- Method getMethod(name, Class...) //获取某个public的Method(包括父类)
- Method getDeclaredMethod(name, Class...) //获取类自身的某个Method(不包括父类)
- Method[] getMethods() //获取所有public的Method(包括父类)
- Method[] getDeclaredMethods() //获取类自身的所有Method(不包括父类)
一个 Method 对象包含一个方法的所有信息:
- String getName() //返回方法名称
- Class<?> getReturnType() //返回方法返回值类型,是一个Class实例
- Class<?>[] getParameterTypes() //返回方法的参数类型,是一个Class数组
- int getModifiers() //返回方法的修饰符,是一个int,不同的bit表示不同的含义。
调用方法:
Method.invoke(Object, Object...)
调用静态方法:
Method.invoke(null, Object...) //invoke方法第一个参数传入null
调用构造方法
获取构造方法:
- Constructor<T> getConstructor(Class<?>... parameterTypes) //获取某个public的Constructor(包括父类)
- Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //获取类自身某个Constructor(不包括父类)
- Constructor<?>[] getConstructors() //获取所有public的Constructor(包括父类)
- Constructor<?>[] getDeclaredConstructors() //获取类自身所有Constructor(不包括父类)
调用构造方法:
Constructor.newInstance(Class...)
获取继承关系
获取父类的Class:
Class getSuperclass();
获取interface:
Class[] getInterfaces();
获取注解
Annotation[] getAnnotations() //获取元素所有注解(包括继承)
<T extends Annotation> getAnnotation(Class<T> annotationClass) //获取元素指定类型注解
default <T extends Annotation> getAnnotationsByType(Class<T> annotationClass) //获取与元素关联的指定类型注解
default <T extends Annotation> getDeclaredAnnotation(Class<T> annotationClass)
Annotation[] getDeclaredAnnotations() //获取元素自身所有注解(不包括继承)
default <T extends Annotation> getDeclaredAnnotationsByType(Class<T> annotationClass) //获取与元素自身关联的指定类型注解
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) //获取元素是否存在指定类型注解