JVM的反射机制

本文探讨了JVM的反射机制,包括其在Java代码中的应用,如Spring的依赖注入和IDE的代码联想。详细解释了反射的效率问题,如Method.invoke()的执行流程,涉及'委派实现'和'本地实现'。文中通过实例分析了反射调用次数超过15次时,JVM如何动态生成字节码以提高效率。此外,还讨论了反射性能开销的几个关键因素,如Class.forName(), Class.getMethod()的耗时,自动装箱的影响,以及数组参数传递对性能的影响。" 60969377,5756929,Python 3.5与PyInstaller 3.2.1打包exe遇到TypeError解决方法,"['Python', 'PyInstaller']
摘要由CSDN通过智能技术生成
  • JVM的反射机制是在Java类编译成字节码的时候,通过jdk提供的工具类的反射方式访问类字节码的字段、方法。并且可以进行一些在Java代码中不能够实现的功能。
  • 反射使用的经典场景:Spring的ioc的依赖注入,以及一些IDE的代码开发联想功能;
  • 之前通过JVM的反射机制还编写了Hibernate的变种版(针对旅游系统的全文检索,对全量索引的数据源功能)。
  • 以上对于JVM的反射功能是通过Java原生代码是实现不了的,但对于反射也是不能频繁使用的,反射机制的效率是很低的,尤其是在统一进程反复调用的时候,反射机制的效率会更加低,以下要通过事列来说明反射机制效率低下的原因。

反射调用的实现
反射的工具代码都在jdk的java.lang.reflect包下
调用代码:

public final class Method extends Executable {
    @CallerSensitive
    public Object invoke(Object var1, Object... var2) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    //省略......
    MethodAccessor var4 = this.methodAccessor;
    if (var4 == null) {
        var4 = this.acquireMethodAccessor();
    }
    return var4.invoke(var1, var2);
}
  • 可以看到method.invoke()方法是委派给了MethodAccessor来处理.MethodAccessor是一个接口,有两个实现:“本地实现”和“委派实现”。只要通过Method.invoke()来调用反射就会生成一个委派实现,只是这个委派实现就是“本地实现”,进入到jvm虚拟久就有方法的地址,该地址指向目标方法,反射只是把参数准备好,然后在调用目标方法。
    package jvm.java7method;
    
    import java.lang.reflect.Method;
    public class MethodTestV0 {
        public static void target(int i) {
            new Exception("#" + i).printStackTrace();
        }
        public static void main(String[] args) throws Exception{
            Class<?> classTestVo = Class.forName("jvm.java7method.Metho
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值