Loading... > Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 # 1、获取Class对象的方法 ![在这里插入图片描述](https://blog.fivk.cn/usr/uploads/2021/10/415386316.png) 1. Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 2. 类名.class:通过类名的属性class获取 * 多用于参数的传递 3. 对象.getClass():getClass()方法在Object类中定义着 * 多用于对象的获取字节码的方式 * 【注意】 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 # 2、Class对象功能 ## 2.1、获取成员变量 `Field[] getFields()` :获取所有public修饰的成员变量 `Field getField(String name)` :获取指定名称的 public修饰的成员变量 `Field[] getDeclaredFields()` :获取所有的成员变量,不考虑修饰符 `Field getDeclaredField(String name)` :获取指定名称的成员变量,不考虑修饰符 ## 2.2、获取构造方法 `Constructor<?>[] getConstructors()` `Constructor<?> getConstructor(Class<?>... parameterTypes)` `Constructor<?>[] getDeclaredConstructors()` `Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes)` ## 2.3、获取成员方法 `Method[] getMethods()` `Method getMethod(String name, Class<?>... parameterTypes)` `Method[] getDeclaredMethods()` `Method getDeclaredMethod(String name, Class<?>... parameterTypes)` ## 2.4、获取全类名 `String getName()` # 3、Field:成员变量对象 * 设置值 `void set(Object obj, Object value)` * 获取值 `get(Object obj)` * 忽略访问权限修饰符的安全检查 `setAccessible(true)` :暴力反射 # 4、Constructor:构造方法对象 * 创建对象 `T newInstance(Object... initargs)` 【注意】如果使用空参数构造方法创建对象,操作可以简化:使用Class对象的newInstance方法 # 5、Method:方法对象 * 执行方法 `Object invoke(Object obj, Object... args)` * 获取方法名 `String getName()` # 6、示例 编写一个类(该类是一个框架),在不改变该类的任何代码的前提下,使用该类创建任意对象,并执行对象的任意方法。 ```java has-numbering public class Person { public void eat() { System.out.println("eat..."); } } ``` ```java has-numbering public class Student { public void study() { System.out.println("study..."); } } ``` ``` #pro.properties className=com.junlong.reflect.Student methodName=study ``` ```java has-numbering public class Reflect { // 不改变该类的任何代码,就可以创建任意对象,并执行其任意方法 public static void main(String[] args) throws Exception { // 1. 加载配置文件 // 1.1 获取类加载器 ClassLoader classLoader = Reflect.class.getClassLoader(); // 1.2 获取配置文件 InputStream is = classLoader.getResourceAsStream("pro.properties"); // 1.3 创建Properties对象 Properties pro = new Properties(); pro.load(is); String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); // 2. 获取class类对象 Class<?> aClass = Class.forName(className); // 2.1 创建对象 Object o = aClass.newInstance(); // 3. 执行方法 // 3.1 获取方法对象 Method method = aClass.getMethod(methodName); // 3.2 执行 method.invoke(o); } } ``` > 感谢小伙伴们的关注! > 你的点赞、评论、关注、收藏是对博主的最大鼓励! > 持续更新JavaSE学习笔记!欢迎订阅专栏! 最后修改:2021 年 10 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏