反射
Java中的反射( java.lang.reflect )
Java反射是一种强大的工具,它允许程序在运行时检查或反射自身,并操作内部属性、构造器、方法和字段。通过反射,可以在运行时动态地创建对象,调用对象的方法,访问和修改对象的字段。
主要作用
- 在运行时获取类的信息。
- 在运行时构造类的实例。
- 在运行时获取类的字段信息并访问它们。
- 在运行时获取类的方法信息并调用它们。
- 在运行时获取类的构造器信息并使用它们创建新的对象。
常用的反射API
-
获取Class对象
Class.forName(String className)
:通过类的全限定名获取Class对象。Object.getClass()
:通过对象实例获取Class对象。ClassName.class
:直接通过类引用获取Class对象。
-
构造器操作
getConstructor(Class<?>... parameterTypes)
:获取指定参数类型的公共构造器。newInstance(Object... initargs)
:创建新实例。
-
字段操作
getField(String name)
:获取指定名称的公共字段。getDeclaredField(String name)
:获取指定名称的所有声明字段(包括私有)。setAccessible(true)
:设置可访问性为true,允许访问私有字段。get(Object obj)
/set(Object obj, Object value)
:获取/设置字段值。
-
方法操作
getMethod(String name, Class<?>... parameterTypes)
:获取指定名称和参数类型的公共方法。invoke(Object obj, Object... args)
:调用方法。
自己实际用到反射的地方
在实习期间,我参与了一个MES项目,其中某个模块包含一个名为“物料”的字段,该字段出现了15次,如物料1、物料2、…、物料15。为了对这些字段进行操作,它们对应的实体类中提供了各自的get和set方法。最初的操作涉及到对所有字段逐一处理,导致代码中出现了15层if语句嵌套。为了简化代码结构,我采用for循环动态生成方法名,并利用反射机制来调用相应的方法。此外,通过设置setAccessible(true)以优化反射操作的性能,从而使得代码更加简洁高效。
// 创建一个列表用于存放物料ID
List<Object> materialIds = new ArrayList<>();