- 什么是反射(反射的机制)
反射是在运行状态中对任意一个类都可以知道其内部所有的属性和方法,对于任意一个对象都可以调用其属性和方法,这种动态获取信息和动态调用对象方法的功能称为Java的反射机制。 - 反射的优缺点
优点:
可以动态执行和动态创建,在编码期不知道类和对象的具体信息,但在运行期间依旧可以根据业务功能执行方法和访问属性,最大程度发挥了编码的灵活性
缺点:
对性能有影响,反射操作总是慢于直接执行Java代码,代码量增多。
维护起来比原生Java代码繁琐
反射会跳过类型检查,导致安全性问题,例如泛型的类型检查 - 反射创建流程(主要方法)
Class.forName(“java.lang.String”)
forName会通过native方法从JVM中获取到类信息然后交给classloader进行类加载
Class.newInstance
先进行权限检查,如果不通过则直接抛出异常,再查找无参构造器并缓存起来,最后调用具体的无参构造方法生成实例并返回 - 总结:
- 反射类及反射方法的获取,都是通过从列表中搜寻查找匹配的方法,所以查找性能会随类的大小方法多少而变化;
- 每个类都会有一个与之对应的Class实例,从而每个类都可以获取method反射方法,并作用到其他实例身上;
- 反射也是考虑了线程安全的,放心使用;
- 反射使用软引用relectionData缓存class信息,避免每次重新从jvm获取带来的开销;
- 反射调用多次生成新代理Accessor, 而通过字节码生存的则考虑了卸载功能,所以会使用独立的类加载器;
- 当找到需要的方法,都会copy一份出来,而不是使用原来的实例,从而保证数据隔离;
- 调度反射方法,最终是由jvm执行invoke0()执行;
面试笔记:Java反射原理
最新推荐文章于 2024-09-11 15:10:43 发布