java反射:框架设计的灵魂

it2025-10-21  9

反射的概念 将类的各个部分封装为其他对象,这就是反射机制 Java代码在计算机中经历的三个阶段 第一阶段:Source源代码阶段 首先写出.java文件,经过编译生成.class字节码文件,由三个比较重要的部分: 1.成员变量,2.构造方法,3.成员方法 第二阶段:Class类对象阶段 类加载器将字节码文件加载到内存中 有一个对象来描述这个字节码文件,就是Class类对象 在Class类对象中,成员变量被封装为Field对象,构造方法被封装为Constructor对象,成员方法被封装为Method对象。 还有第三阶段(Runtime运行时阶段) 就是创建了一个对象 反射的好处 1.在程序运行中操作这些对象 2.解耦,提高可扩展性 获取class对象的方式 在第一阶段: Class.forName(“全类名”);字节码文件加载进内存,返回class对象 在第二阶段: 类名.class:通过类名的属性class获取 在第三阶段: 对象.getClass(),这个方法在object里被定义

public class reflectDemo { /* 获取class对象的方式: 在第一阶段: Class.forName("全类名");字节码文件加载进内存,返回class对象 多用于配置文件,传的是字符串 在第二阶段: 类名.class:通过类名的属性class获取 多用于参数的传递 在第三阶段: 对象.getClass(),这个方法在object里被定义 多用于对象获取 */ public static void main(String[] args) throws ClassNotFoundException { // Class.forName("全类名"); Class clase1 = Class.forName("human.Person"); System.out.println(clase1); //类名.class Class clase2 = Person.class; System.out.println(clase2); //对象.getClass() Person p1 = new Person(); Class clsse3 = p1.getClass(); System.out.println(clsse3); System.out.println(clase1 == clase2); System.out.println(clase2 == clsse3); } }

输出结果: class human.Person class human.Person class human.Person true true 我们可以得到一个结论: 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方法获取的类对象都是同一个。

class对象的使用 *获取功能 1.获取成员变量们 Field[] getFields()//获取public的成员变量 Field getField(String name)//获取指定名称的public的成员变量

Field[] getDeclaredFields()//所有的成员变量 Field getDeclaredField(String name)//指定名称的,但是访问私有的会报错,你需要先d.setAccessible(true)//暴力反射 2.获取构造方法们 Constructor[] getConstruetors() Constructor getConstructor(类<?>… parameterTypes)

Constructor[] getDeclaredConstruetors() Constructor getDeclaredConstructor(类<?>… parameterTypes) 3.获取成员方法们,和成员变量差不多 Method[] getMethods()//object类里边的方法也会被打印出来 Method getMethod(String name,类<?>…parameterTypes)//后面写的是参数的类型,例如String.class

Method[] getDeclaredMethods() Method getDeclaredMethod(String name,类<?>…parameterTypes) 4.获取类名 String getName() 类对象.getName() Field的使用 Field.get(对象) Field.set(对象,value) Constructor的使用 创建对象: constructor.newInstance(,); 如果使用空的参数的构造方法来创建对象,操作可以简化:Class对象的newInstance()方法 Method的使用 执行方法 Method.invoke(对象,参数); 获取方法的名称 Method.getname(); 小例子 创建一个“框架”,在不改变其代码的情况下执行任意类的方法

public class reflectDemo { public static void main(String[] args) throws Exception { //1.加载配置文件 //1.1创建Properties对象 Properties pro = new Properties(); //1.2加载配置文件,使其成为一个集合 ClassLoader classLoader = reflectDemo.class.getClassLoader();//获取该类的类加载器 InputStream is = classLoader.getResourceAsStream("pro.properties"); pro.load(is); //2.获取配置文件中的数据 String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); //3.加载这个类进内存 Class clase = Class.forName(className); //4.创建对象 Object obj = clase.newInstance(); //5.获取方法对象 Method method = clase.getMethod(methodName); //6.执行方法 method.invoke(obj); } }

每日一问 idea快捷键有哪些

最新回复(0)