Java基础-反射(Reflection)

反射是指程序在运行期可以拿到一个对象的所有信息。

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) //获取元素是否存在指定类型注解

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。