打开网易新闻 查看更多图片

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面试题练习

打开网易新闻 查看更多图片