面试_java_反射

86 阅读2分钟

什么是反射

java的放射机制:加载编译期生成的字节码文件,使程序在运行期时有能力获取当前类的所有方法和属性;并且对于任意一个对象,可以调用它的任意方法或者获取其属性。

简单说,反射机制指的是程序在运行时能够获取自身的信息。




应用

  • jdbc 就是典型的反射:Class.forName('com.mysql.jdbc.Driver.class');
  • Spring通过反射来帮我们实例化对象,并放入到Ioc容器中



new和反射创建有什么区别呢?哪个效率更高?

  • new:静态编译,在编译期就将模块编译进来,执行该字节码文件,所有的模块都被加载;

  • 反射:动态编译,编译期没有加载,等到模块被调用时才加载;

通过new创建对象的效率比较高。反射包括了一些动态类型,JVM无法对这些代码进行优化,所以效率较低。




既然效率低那为什么要用反射?怎样提升效率?优缺点?

优点:

  • 程序在运行时能够获取自身的信息
  • 增加程序的灵活性,方便外部调用

缺点:

  • 性能上:反射包括了一些动态类型,JVM无法对这些代码进行优化,并且需要解析字节码,所以效率较低。
  • 安全性:破坏了封装性,因为通过反射可以获得私有方法和属性。相对不安全

解决方案:

  • 通过setAccessible(true)关闭JDK的安全检查来提升反射速度;



反射使用步骤(获取 Class 对象、调用对象方法)

  1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。

    有三种方法获取(第三种用的最多):

    • 类名.class
    • 对象名.getClass()
    • Class.forName(“类的路径”);
  2. 调用 Class 类中的方法,既就是反射的使用阶段。


利用反射创建对象的两种方法,见本站另一篇文章:Java创建对象的几种方法




如何通过反射操作类的私有属性?

setAccessable(true);




blog.nowcoder.net/n/65f9c9172… juejin.cn/post/684490…