CodeWalk

Java反射机制详解(Class/Field/Method/Constructor)?

作者:小字辈 · 2026-05-30 12:55

请详细解释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利用反射实现动态代理。