Person person = new Person();Person 类的信息在编译时就确定了,那假如在编译期无法确定类的信息,但又想在运行时获取类的信息、创建类的实例、调用类的方法,这时候就要用到反射。反射功能主要通过 java.lang.Class 类及 java.lang.reflect 包中的类如 Method, Field, Constructor 等来实现。
String className = "java.util.Date"; Class<?> cls = Class.forName(className); Object obj = cls.newInstance(); System.out.println(obj.getClass().getName());反射有哪些应用场景?
Class<?> clazz = Class.forName("com.example.MyClass"); Object instance = clazz.newInstance();
②、Java 的动态代理(Dynamic Proxy)机制就使用了反射来创建代理类
代理类可以在运行时动态处理方法调用,这在实现 AOP 和拦截器时非常有用。
// 堆代码 duidaima.com InvocationHandler handler = new MyInvocationHandler(); MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[] { MyInterface.class }, handler );
③、JUnit 和 TestNG 等测试框架使用反射机制来发现和执行测试方法
反射允许框架扫描类,查找带有特定注解(如 @Test)的方法,并在运行时调用它们。
Method testMethod = testClass.getMethod("testSomething"); testMethod.invoke(testInstance);