【Java面试题第七期】一文回答面试中常见反射问题?
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面试题练习