Java反射(二):反射的一些基本操作

对于任何一个类class实例,我们通过反射(获取其Class类实例)就可以获取它的一切信息。

获取字段信息(Field类)

Class类提供了以下几个实例方法来获取Field类

  • Field getField(String name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(String name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)

注:可以使用void setAccessible(boolean flag)来决定是否可以访问非public字段。如果JVM运行期存在SecurityManager,那么它会根据规则进行检查,有可能阻止setAccessible(true)

一个Field类实例包含了一个字段的所有信息:

  • String getName():返回字段名称
  • Class<?> getType():返回字段类型信息(Class类实例,如String.class
  • int getModifiers():返回字段的修饰符信息,Modifier类的静态方法isXXX(如Modifier.isPublic(int))根据其int返回值进行位运算来判断是否含有某个修饰符

获取/设置字段值(getter/setter)

不仅可以利用反射拿到类class字段的一个Field类实例,还可以利用Object get(Object obj)方法获取类class实例字段的具体值和void set(Object obj, Object value)方法设置字段的值。

注:参数obj为类class实例,若为静态字段,只需将实参obj赋为null

获取方法信息

我们不仅可以通过Class类实例获取Field类实例来得到字段信息,同样的,也可以获取Method类来得到方法信息。

Class类提供了以下实例方法来获取Method类

  • Method getMethod(name, Class...):获取某个publicMethod(包括父类)
  • Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
  • Method[] getMethods():获取所有publicMethod(包括父类)
  • Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)

注:同样含有void setAccessible(boolean flag)方法

一个Method实例包含一个方法的所有信息:

  • String getName():返回方法名称
  • Class<?> getReturnType():返回方法返回值类型
  • Class<?>[] getParameterTypes():返回方法的参数类型
  • int getModifiers():返回方法的修饰符(同Field类

调用方法

当我们获取到一个Method类实例时,可以通过Object invoke(Object obj, Object... args)调用。

注:对Method实例调用invoke就相当于调用该方法,invoke的第一个参数是对象实例,即在哪个实例上调用该方法,后面的可变参数要与方法参数一致。若为为静态方法,只需将obj赋为null

使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。

Guess you like

Origin juejin.im/post/7034413172245299231