[关闭]
@TryLoveCatch 2022-04-18T12:31:45.000000Z 字数 2559 阅读 657

Java知识体系之反射

Java知识体系


Java 技术之反射

反射

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。
通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

编译期和运行期

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。
简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

哪些地方用到了反射?

  1. public class DebugInvocationHandler implements InvocationHandler {
  2. /**
  3. * 代理类中的真实对象
  4. */
  5. private final Object target;
  6. public DebugInvocationHandler(Object target) {
  7. this.target = target;
  8. }
  9. public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
  10. System.out.println("before method " + method.getName());
  11. // 这里用到了反射!!!!!
  12. Object result = method.invoke(target, args);
  13. System.out.println("after method " + method.getName());
  14. return result;
  15. }
  16. }

反射的优缺点

反射为什么慢?

https://zhuanlan.zhihu.com/p/152635495

所以说:

获取Class对象有那几种方式?有什么区别?

https://blog.csdn.net/wo541075754/article/details/105133115

  1. Object.class
    需要知道具体的类,并且能够引入类名
  2. Class.forName("java.util.String")
    通过类的全路径获取Class对象
  3. new Object().getClass()
    通过对象实例获取Class对象
-- Object.class Class.forName() new Object().getClass()
编译器or运行期? 编译器 运行期 编译器
执行类的初始化?
需要依赖反射类的包?

反射一次和反射多次效率一样吗?

不一样,如上所述:

反射在达到一定次数时,会动态编写字节码并加载到内存中,这个字节码没有经过编译器优化,也不能享受JIT优化。

new 关键词 和newInstance()方法的区别?

参考

https://javaguide.cn/java/basis/reflection.html#%E4%BD%95%E4%B8%BA%E5%8F%8D%E5%B0%84
https://www.cnblogs.com/wkfvawl/p/14806214.html
https://www.jianshu.com/p/4e2b49fa8ba1
https://blog.csdn.net/wo541075754/article/details/105133115
https://blog.csdn.net/One_hundred_nice/article/details/103607140

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注