在 Java 中,反射(Reflection) 可以在运行时获取类的结构信息(类名、属性、方法、构造器等),并可以动态调用。下面按“常用场景 + 示例代码”来说明。
反射的起点是 Class 对象:
// 方式1:通过类名
Class<?> clazz1 = Student.class;
// 方式2:通过对象
Student s = new Student();
Class<?> clazz2 = s.getClass();
// 方式3:通过全类名(最常用,动态性最强)
Class<?> clazz3 = Class.forName("com.example.Student");
Class<?> clazz = Class.forName("com.example.Student");
System.out.println(clazz.getName()); // 全类名
System.out.println(clazz.getSimpleName()); // 类名
System.out.println(clazz.getPackage()); // 包信息
System.out.println(clazz.getModifiers()); // 修饰符
// 所有 public 构造
Constructor<?>[] constructors = clazz.getConstructors();
// 指定参数类型的构造
Constructor<?> constructor =
clazz.getConstructor(String.class, int.class);
// 创建对象
Object obj = constructor.newInstance("Tom", 18);
若构造是
private,可用getDeclaredConstructor()+setAccessible(true)
// 所有 public 字段
Field[] fields = clazz.getFields();
// 指定字段
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); // 访问 private
// 获取 / 设置值
Object value = field.get(obj);
field.set(obj, "Jerry");
// 所有 public 方法
Method[] methods = clazz.getMethods();
// 指定方法
Method method = clazz.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true);
// 调用
Object result = method.invoke(obj, "World");
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation ann = clazz.getAnnotation(MyAnnotation.class);
System.out.println(ann.value());
}
setAccessible(true)ClassNotFoundException、NoSuchMethodException如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。