推荐答案
// www.javascriptcn.com code example
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 获取Class对象
Class<?> clazz = Class.forName("com.example.MyClass");
// 通过反射创建对象
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();
// 通过反射调用方法
Method method = clazz.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true); // 如果方法是私有的,需要设置为可访问
method.invoke(instance, "Hello, Reflection!");
// 通过反射访问属性
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true); // 如果属性是私有的,需要设置为可访问
field.set(instance, "New Value");
System.out.println(field.get(instance));
}
}本题详细解读
1. 获取Class对象
在Java中,反射的第一步是获取目标类的Class对象。可以通过以下方式获取:
Class.forName("全限定类名"):通过类的全限定名获取Class对象。MyClass.class:通过类字面常量获取Class对象。instance.getClass():通过对象实例获取Class对象。
2. 通过反射创建对象
通过Class对象获取构造器(Constructor),然后使用newInstance()方法创建对象。如果构造器是私有的,需要先调用setAccessible(true)来绕过访问控制。
Constructor<?> constructor = clazz.getDeclaredConstructor(); Object instance = constructor.newInstance();
3. 通过反射调用方法
通过Class对象获取方法(Method),然后使用invoke()方法调用该方法。如果方法是私有的,需要先调用setAccessible(true)来绕过访问控制。
Method method = clazz.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true);
method.invoke(instance, "Hello, Reflection!");4. 通过反射访问属性
通过Class对象获取属性(Field),然后使用set()方法设置属性值,或使用get()方法获取属性值。如果属性是私有的,需要先调用setAccessible(true)来绕过访问控制。
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true);
field.set(instance, "New Value");
System.out.println(field.get(instance));5. 注意事项
- 反射操作可能会破坏封装性,因此应谨慎使用。
- 反射操作通常比直接调用方法或访问属性要慢,因此在性能敏感的场景中应避免使用。
- 反射操作可能会抛出
IllegalAccessException、NoSuchMethodException等异常,需要进行适当的异常处理。