Java反射

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

什么是反射

Java中class和interface的数据类型都是class类型,每加载一个class,JVM就为其创建一个class类型的实例,并关联起来。
JVM的每个Class实例都指向一个数据类型(class或者interface)
一个Class实例包含该class的完整信息,就是说每加载一个类的时候都会加载一个class示例,这个class示例包含该类所有的信息,我们通过获取该类的class实例然后获取到class保存的方法信息就叫反射。

获取class实例

3种获取class实例的方法

  • String.class
  • object.getClass()
  • Class.forName()

class在jvm中只会有一个实例,所以可以直接使用==

访问class的字段

通过Class实例获取字段field信息:

  • getField(name):获取某个public的field(包括父类)
  • getDeclaredField(name):获取当前类的某个field(不包括父类)
  • getFields():获取所有public的field(包括父类)
  • getDeclaredFields():获取当前类的所有field(不包括父类)

Field对象包含一个field的所有信息:

  • getName()
  • getType()
  • getModifiers()

获取和设置field的值:
get(Object obj) 获取对象该field的值!
set(Object, Object)

image.png

由代码可以知道;反射的field 相当于一个工具的类,需要作用于所需的对象上去,自己本身不具有某些属性

通过反射访问Field需要通过SecurityManager设置的规则。

通过设置setAccessible(true)来访问非public字段。

image.png

Method

通过Class实例获取方法Method信息:

  • getMethod(name, Class…):获取某个public的method(包括父类) 后面那些class表示方法的参数类型,因为方法存在重载所以要确定参数类型
  • getDeclaredMethod(name, Class…):获取当前类的某个method(不包括父类)
  • getMethods():获取所有public的method(包括父类)
  • getDeclaredMethods():获取当前类的所有method(不包括父类)

Method对象包含一个method的所有信息:

  • getName()
  • getReturnType()
  • getParameterTypes()
  • getModifiers()

调用Method:

  • Object invoke(Object obj, Object… args)

通过设置setAccessible(true)来访问非public方法。 反射调用Method也遵守多态的规则。

Constructor

Class.newInstance() 只能调用public无参数构造方法,但是带参数的不可以这样使用,而是使用Constructor对象

通过Class实例获取Constructor信息:

  • getConstructor(Class…):获取某个public的Constructor
  • getDeclaredConstructor(Class…):获取某个Constructor
  • getConstructors():获取所有public的Constructor
  • getDeclaredConstructors():获取所有Constructor

通过Constructor实例可以创建一个实例对象:

  • newInstance(Object… parameters)

通过设置setAccessible(true)来访问非public构造方法。

获取继承关系

获取父类的Class:

Class getSuperclass()

  • Object的父类是null
  • interface的父类是null

获取当前类直接实现的interface:

  • Class[] getInterfaces()
  • 不包括间接实现的interface
  • 没有interface的class返回空数组
  • interface返回继承的interface

判断一个向上转型是否成立:

  • bool isAssignableFrom(Class)

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%