一. 反射概念
反射(Reflection)允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态操作类的能力。
二. Java反射的基本使用和应用
java.lang.reflect 是 Java 反射机制的核心包 ,提供了操作类及其成员(字段、方法、构造函数等)的类和接口。通过这些 API,开发者可以在运行时动态地查询和修改类的结构。
2.1 获取Class对象
-
通过类字面量
// 类字面量 Class<?> peoClass = Peo.class;
-
通过getClass方法
// getClass方法 Peo peo = new Peo(); Class<?> peoClass2 = peo.getClass();
-
通过Class.forName()
// Class.forName()方法 Class<?> peoClass3 = Class.forName("Peo");
2.2 创建对象
// 通过反射动态创建对象 Peo peo = Peo.class.getDeclaredConstructor().newInstance();
2.3 访问成员属性
// 访问字段Class<?> classPeo = Peo.class;Field field = classPeo.getDeclaredField("name");field.setAccessible(true); // 如果字段是私有的, 需要设置为可访问field.set(peo, "xynu"); // 设置字段值Object o = field.get(peo); // 获取字段值System.out.println(o);
2.4 访问成员方法
调用无参方法
Method method = classPeo.getDeclaredMethod("print"); method.invoke(peo);
调用有参方法
Method method1 = classPeo.getDeclaredMethod("add", Integer.class, Integer.class); method1.invoke(peo, 1, 2);
2.5 获取构造函数
Class<?> classPeo = Peo.class;// 获取构造函数Constructor<?> constructor = classPeo.getConstructor(String.class, Integer.class);System.out.println(constructor.getName());
2.6 获取接口和父类
Class<?> classPeo = Peo.class;// 获取接口和父类Class<?>[] interfaces = classPeo.getInterfaces();for (Class<?> c : interfaces) {System.out.println(c.getName());}Class<?> superclass = classPeo.getSuperclass();System.out.println(superclass.getName());