java反射的底层原理,机制,优点和缺点

java反射的底层原理,机制,优点和缺点

(1).什么是反射

java反射机制核心是在程序运行时动态加载类对象并获取类的信息,本质是jvm获得class对象后,再通过对象反编译,获取对象各种信息,普通获取对象的方式是通过编译生成.class文件,jvm再加载.class文件获取类的信息,在jvm中生成一个对象

(2)反射优点

<1>可通过配置文件动态加载所需要的的类,而不需要在编译前去new一个对象,对项目进行了解耦

<2>可以通过反射访问java的方法,属性,包括私有的(需要setAccessible(true)跳过权限检查)

(3)反射效率低的原因

<1>Method的invoke方法要对参数进行装箱和拆箱

invoke方法传参是Object[]类型,如果方法参数是简单类型,需要装箱为Object类型,
比如Long在java编译的时候,用了Long.valueOf()转型,并且封装为Objcet数组,
然后生成对象字节码时,因为需将参数传入方法,需要将参数数组拆箱,
恢复到没有被Objcet[]包装前的样子,装箱和拆箱造成额外的内存浪费

<2>需要检查方法的可见性

在这里插入图片描述

每次调用invoke都需要检查方法的可见性

<3>反射时需要校验参数

invoke时需要检查每个实际参数和形参的类型是否匹配

<4>反射方法难以内联

因为是动态去执行方法,通过java的对象反编译去获取类的信息去执行,Jit优化较难识别

<4>每次调用getMethod方法会对method对象做一次拷贝

    @CallerSensitive
    public Method getMethod(String name, Class<?>... parameterTypes)
        throws NoSuchMethodException, SecurityException {
        Objects.requireNonNull(name);
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
        }
        Method method = getMethod0(name, parameterTypes);
        if (method == null) {
            throw new NoSuchMethodException(methodToString(name, parameterTypes));
        }
        return getReflectionFactory().copyMethod(method);
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值