- 反射: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