Java反射机制笔记

Java反射机制是Java开发中较为高级的一种技术,反射库提供了非常强大的功能以便实现在运行时分析与查看类对象,以及进行方法的调用等功能。

反射是一种功能强大且较为复杂的机制,使用该库的主要是工具构造者而非应用程序开发者。

要学习反射机制,主要熟悉以下几个类

  • Class
  • Constructor
  • Field
  • Method
  • Modifier

Class

Class类主要用于JVM运行中所有Java对象的类型标识,使用getClass()方法可以获得当前对象的Class类实例,JVM基于Class所存储的信息,在运行时选择相应的方法执行。

Class类包含了以下的一些信息:

  1. 类字段信息
  2. 类构造方法信息
  3. 类方法信息
  4. 类中修饰符信息
  5. 其他的一些类相关信息

Class类可以创建类对象,使用Class.forName().newInstance()方法即可,也可以使用Constructor来调用其他的构造方法并传递参数来构造一个对象。

  • Class.forName().newInstance()
  • Class.forName().getConstructor().newInstance();

使用Class类的一些方法,可以获得Field、Method ..等对象数组

Field[] fields = *.getClass().getDeclaredFields();
Method[] methods = *.getClass().getDeclaredMethods();
Constructor[] constructors = *.getClass().getDeclaredConstructors();
Field[] fields1 = *.getClass().getFields();
Method[] methods1 = *.getClass().getMethods();
Constructor[] constructors1 = *.getClass().getConstructors();

尝试修改以上代码,来查看Class类方法获取不同的数组集合区别。

Constructor

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

Constructor 包含了类的构造方法的相关信息,使用Class类的getConstructors() 方法可以获取到Constructor 数组集合,可以在其中查找适合的构造方法,然后使用newInstance()构造该类的对象。可以使用以下示例来打印指定对象的所有构造方法。

Modifier.toString(constructor.getModifiers()) + " " + constructor.getName() + " (" + Arrays.toString(constructor.getParameterTypes()) + ")"

Field

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

Field类通常包含一个类对象中的某个字段的所有相关信息。

get(Object obj)
返回指定对象上此 Field 表示的字段的值。

使用以上方法,可以获取到某个指定对象上当前Field的值

setAccessible(boolean flag) – 无法修改JDK自带JAR包中的安全类

​ 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

使用以上方法,可以设置字段的可见性,如将private String name使用get()方法会抛出IllegalAccessException异常,执行该方法并传递true,即可使用get方法获取字段值。

Method

Method类主要包含了类中方法的相关信息,使用Class.getMethods()可以获取到一个Method数组,在其中可遍历获取所需方法Method对象,也可以直接使用Class类对象的getMethod方法并传递方法名及参数类型也可获取Method方法,Method对象可以执行invoke(Object obj, Object… args) 方法来执行这个方法,若该方法为静态方法,则第一个参数传递NULL即可,若不为静态方法,则传递所需执行方法的对象引用即可,后面的参数不限。

Modifier

Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。修饰符集被表示为整数,用不同的位位置 (bit position) 表示不同的修饰符。

在前面所介绍的几个类中,均有该方法getModifiers() ,该方法返回一个整数,该整数代表不同修饰符的int值,该方法继承自Member接口。

可以使用Modifier类的toString方法,并传递该getModifiers()方法即可获取到当前Member接口实现类所使用的修饰符。

示例如下:

​ Modifier.toString(method.getModifiers())

发表评论

电子邮件地址不会被公开。 必填项已用*标注