Java 反射

113 阅读1分钟

Java 反射(Reflection)

反射是 Java 编程语言的一个特性,它允许在运行时检查和操作类、方法、属性等程序元素的信息。通过反射机制,可以在程序运行时获取类的信息,创建对象,调用方法,访问属性等。

1. 获取 Class 对象

在 Java 中,有三种常见的方式获取 Class 对象:

a. 使用 forName 方法

try {
    Class<?> myClass = Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

b. 使用 .class 语法

Class<?> myClass = MyClass.class;

c. 使用 getClass 方法

MyClass obj = new MyClass();
Class<?> myClass = obj.getClass();

2. 使用 Class 对象获取类的信息

通过 Class 对象,可以获取类的方法、构造方法、字段等信息。

a. 获取所有方法

Method[] methods = myClass.getMethods();

b. 获取指定方法

Method method = myClass.getMethod("methodName", parameterTypes);

c. 获取所有构造方法

Constructor<?>[] constructors = myClass.getConstructors();

d. 获取指定构造方法

Constructor<?> constructor = myClass.getConstructor(parameterTypes);

e. 获取所有字段

Field[] fields = myClass.getFields();

f. 获取指定字段

Field field = myClass.getField("fieldName");

3. 创建对象和调用方法

a. 创建对象

Object obj = myClass.newInstance(); // 要求类必须有无参数的构造方法

b. 调用方法

method.invoke(obj, args); // args 为方法的参数

4. 访问私有成员

通过反射也可以访问私有成员,需要设置访问权限:

field.setAccessible(true); // 设置私有字段可访问

5. 应用场景

反射机制常用于以下场景:

  • 动态加载类和创建对象,实现可插拔的架构。
  • 在运行时检查和操作类的信息,实现通用框架。
  • 编写通用的代码操作,如序列化、对象映射等。

需要注意,反射的使用可能会降低程序的性能,因为它是在运行时进行类型检查和方法调用的,而不是在编译时。因此,在性能要求较高的场景中,应慎重使用反射机制。