java反射的作用 反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。 1)在运行时判断任意一个对象所属的类。 2)在运行时构造任意一个类的对象。 3)在运行时判断任意一个类所具有的成员变量和方法。 4)在运行时调用任意一个对象的方法。 实现Java反射的类 1)Class:表示正在运行的Java应用程序中的类和接口。 注意: 所有获取对象的信息都需要Class类来实现。 2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限。 3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限。 4)Method:提供类或接口中某个方法的信息。 java反射机制 可以在运行时判断⼀个对象所属的类,构造⼀个类的对象,判断类具有的成员变量和方法,调用1个对象的方法。 4个关键的类:Class,Constructor,Field,Method。 getConstructor获得构造函数/getDeclardConstructor; getField/getFields/getDeclardFields获得类所生命的所有字段; getMethod/getMethods/getDeclardMethod获得类声明的所有方法,正常方法是⼀个类创建对象,而反射是1个对象找到1个类。 如何通过反射获取和设置对象私有字段的值? 可以通过类对象的 getDeclaredField()方法字段(Field)对象,然后再通过字段对象的 setAccessible(true)将其设置为可以访问,接下来就可以通过get/set 方法来获取/设置字段的值了。 如何通过反射创建对象? 方法 1:通过类对象调用 newInstance()方法,例如: String.class.newInstance() 方法 2:通过类对象的 getConstructor()或 getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”); 反射机制的优缺点 优点: 1)能够运行时动态获取类的实例,提高灵活性; 2)与动态编译结合; 缺点: 1)使用反射性能较低,需要解析字节码,将内存中的对象进行解析。 解决方案: 1、通过setAccessible(true)关闭JDK的安全检查来提升反射速度; 2、多次创建一个类的实例时,有缓存会快很多; 3、ReflflectASM工具类,通过字节码生成的方式加快反射速度; 反射机制的应用场景有哪些? 反射是框架设计的灵魂。 在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。 举例: ①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序; ②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过XML 配置模式装载Bean 的过程: 1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性; 小程序:IT面试题练习 |
|
来自: IT乐知 > 《程序员的私房笔记》