java 如何反射
反射的基本概念
反射是Java在运行时动态获取类信息、操作类属性和方法的能力。通过反射可以在运行时检查类、接口、字段和方法,而不需要在编译时知道类的具体细节。
获取Class对象
反射的核心是Class对象,以下是获取Class对象的几种方式:
- 通过类名获取:
Class<?> clazz = String.class; - 通过对象获取:
String str = "Hello"; Class<?> clazz = str.getClass(); - 通过全限定类名动态加载:
Class<?> clazz = Class.forName("java.lang.String");
获取类的构造方法
通过Class对象可以获取类的构造方法并创建实例:

Constructor<?> constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance("Hello");
获取类的字段
反射可以访问类的字段(包括私有字段):
Field field = clazz.getDeclaredField("value");
field.setAccessible(true); // 访问私有字段
Object value = field.get(instance);
调用类的方法
通过反射可以动态调用类的方法:

Method method = clazz.getMethod("substring", int.class);
String result = (String) method.invoke(instance, 2);
反射的优缺点
优点:
- 动态加载类,提高灵活性。
- 适用于框架开发(如Spring、Hibernate)。
缺点:
- 性能较差,比直接调用慢。
- 破坏封装性,可能导致安全问题。
示例代码
以下是一个完整的反射示例:
import java.lang.reflect.*;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("java.lang.String");
Constructor<?> constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance("Hello World");
Method method = clazz.getMethod("substring", int.class);
String result = (String) method.invoke(instance, 6);
System.out.println(result); // 输出 "World"
}
}






