Java反射机制详解(Class/Field/Method/Constructor)?
请详细解释Java**反射(Reflection)**机制。说明Class对象的获取方式、Field/Method/Constructor类的使用,以及反射如何访问private成员、调用方法和创建实例。
回答
小字辈
获取Class对象:
Class<?> c1 = Class.forName("java.lang.String");
Class<?> c2 = "hello".getClass();
Class<?> c3 = String.class;
Field(字段):
Field field = clazz.getDeclaredField("privateField");
field.setAccessible(true); // 绕过private检查
Object val = field.get(instance);
field.set(instance, newVal);
Method(方法):
Method method = clazz.getDeclaredMethod("methodName", paramTypes);
method.setAccessible(true);
Object result = method.invoke(instance, args);
Constructor(构造方法):
Constructor<?> cons = clazz.getDeclaredConstructor(String.class);
cons.setAccessible(true);
Object obj = cons.newInstance("arg");
常用API:
- getFields():获取所有public字段(含继承)
- getDeclaredFields():获取本类所有字段(含private,不含继承)
- getMethods() / getDeclaredMethods()
- getAnnotations() / getDeclaredAnnotations()
注意:setAccessible(true)会绕过Java访问控制,但可能被SecurityManager阻止。
动态代理:java.lang.reflect.Proxy利用反射实现动态代理。