JVM底层操作总结:反射、动态代理、lambda、注解等

本文详细介绍了JVM底层的反射机制,包括如何通过反射获取类信息、构造器、方法,以及反射调用带来的性能开销和优化措施。还探讨了JDK动态代理和CGlib动态代理的实现原理,以及lambda表达式的编译过程和注解的运行时处理。此外,简单提及了Stream的pipeline概念。
摘要由CSDN通过智能技术生成
  • 反射:https://www.cnblogs.com/yougewe/p/10125073.html

将Java文件保存到本地硬盘后,编译Java文件,生成.class文件,然后使用JVM将字节码文件加载到内存,字节码文件在内存(方法区)中生成一个Class类表示此Java对象

使用反射的时候,首先获取到Class类,这样就可以得到class文件里的所有内容,包含属性、构造方法、普通方法;
属性通过Filed类表示,构造方法通过Constructor表示,普通方法通过Method表示

Class.forName(name):先获取ClassLoader, 然后调用native方法获取Class信息,最后,jvm会回调 ClassLoader 进行类的加载

newInstance():主要就是拿到无参的构造器进行调用,而获取匹配的构造器则分为三步:
1 先获取所有的constructors, 然后通过进行参数类型比较
2 找到匹配后,通过 ReflectionFactory copy一份constructor返回,否则抛出 NoSuchMethodException

class.getDeclaredMethod(nam):获取所有方法列表,根据要调用的方法名称,去方法列表里选出匹配的方法即可,如果没有则抛异常

Method.invoke(Object obj, Object… args):通过native的invoke0()执行;
method.invoke()方法支持多态特性,其native实现在方法真正执行之前通过动态连接或者虚方法表来实现:https://blog.csdn.net/wenyuan65/article/details/81145900,总体来说就是:

当反射调用的方法是接口方法时,调用Reflection::resolve_interface_call(),该方法依赖LinkResolver::resolve_interface_call()来完成方法的动态链接过程

当反射调用的方法是可以被覆盖的方法,例如Animal.print(), Reflection::invoke()最终通过查询虚方法表vtable来确定最终的method。

(针对方法调用动态分派的过程,虚拟机会在类的方法区建立一个虚拟方法表的数据结构(virtual method table,vtable),

针对于invokeinterface指令来说,虚拟机会建立一个叫做接口方法表的数据结构(interface method table,itable):https://blog.csd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值