什么是反射
java的放射机制:加载编译期生成的字节码文件,使程序在运行期时有能力获取当前类的所有方法和属性;并且对于任意一个对象,可以调用它的任意方法或者获取其属性。
简单说,反射机制指的是程序在运行时能够获取自身的信息。
应用
- jdbc 就是典型的反射:
Class.forName('com.mysql.jdbc.Driver.class'); - Spring通过反射来帮我们实例化对象,并放入到Ioc容器中
new和反射创建有什么区别呢?哪个效率更高?
-
new:静态编译,在编译期就将模块编译进来,执行该字节码文件,所有的模块都被加载;
-
反射:动态编译,编译期没有加载,等到模块被调用时才加载;
通过new创建对象的效率比较高。反射包括了一些动态类型,JVM无法对这些代码进行优化,所以效率较低。
既然效率低那为什么要用反射?怎样提升效率?优缺点?
优点:
- 程序在运行时能够获取自身的信息
- 增加程序的灵活性,方便外部调用
缺点:
- 性能上:反射包括了一些动态类型,JVM无法对这些代码进行优化,并且需要解析字节码,所以效率较低。
- 安全性:破坏了封装性,因为通过反射可以获得私有方法和属性。相对不安全
解决方案:
- 通过setAccessible(true)关闭JDK的安全检查来提升反射速度;
反射使用步骤(获取 Class 对象、调用对象方法)
-
获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。
有三种方法获取(第三种用的最多):
- 类名.class
- 对象名.getClass()
- Class.forName(“类的路径”);
-
调用 Class 类中的方法,既就是反射的使用阶段。
利用反射创建对象的两种方法,见本站另一篇文章:Java创建对象的几种方法
如何通过反射操作类的私有属性?
setAccessable(true);