详见:http://www.cnblogs.com/onlywujun/p/3519037.html html
在写代码的时候,发现Method能够调用子类的对象,但子类即便是改写了的Method,方法名同样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但仍是想弄懂java是如何实现的,就学习了下Method的源代码。 java
Method的invoke方法缓存
1.先检查 AccessibleObject的override属性是否为true。ide
AccessibleObject是Method,Field,Constructor的父类,override属性默认为false,可调用setAccessible方法改变,若是设置为true,则表示能够忽略访问权限的限制,直接调用。学习
2.若是不是ture,则要进行访问权限检测。用Reflection的quickCheckMemberAccess方法先检查是否是public的,若是不是再用Reflection.getCallerClass(1)方法获ui
获得调用这个方法的Class,而后作是否有权限访问的校验,校验以后缓存一次,以便下次若是仍是这个类来调用就不用去作校验了,直接用上次的结果,(很奇怪用这种方式缓存,由于这种方式若是下次换个类来调用的话,就不用会缓存了,而再验证一遍,把此次的结果作为缓存,但上一次的缓存结果就被冲掉了。这是一个很简单的缓冲机制,只适用于一个类的重复调用)。htm
3.调用MethodAccessor的invoke方法。每一个Method对象包含一个root对象,root对象里持有一个MethodAccessor对象。咱们得到的Method独享至关于一个root对象的镜像,全部这类Method共享root里的MethodAccessor对象,(这个对象由ReflectionFactory方法生成,ReflectionFactory对象在Method类中是static final的由native方法实例化)。对象
ReflectionFactory生成MethodAccessor:若是noInflation的属性为true则直接返回MethodAccessorGenerator建立的一个MethodAccessor。blog
不然返回DelegatingMethodAccessorImpl,并将他与一个NativeMethodAccessorImpl互相引用。但DelegatingMethodAccessorImpl执行invoke方法的时候又委托给NativeMethodAccessorImpl了。get
再一步深刻
4.NativeMethodAccessorImpl的invkoe方法:
调用natiave方法invoke0执行方法调用.
注意这里有一个计数器numInvocations,每调用一次方法+1,当比 ReflectionFactory.inflationThreshold(15)大的时候,用MethodAccessorGenerator建立一个MethodAccessor,并把以前的DelegatingMethodAccessorImpl引用替换为如今新建立的。下一次DelegatingMethodAccessorImpl就不会再交给NativeMethodAccessorImpl执行了,而是交给新生成的java字节码的MethodAccessor。
MethodAccessorGenerator使用了asm字节码动态加载技术,暂不深刻研究。
总结 一个方法能够生成多个Method对象,但只有一个root对象,主要用于持有一个MethodAccessor对象,这个对象也能够认为一个方法只有一个,至关因而static的。由于Method的invoke是交给MethodAccessor执行的,因此我所想要知道的答案在MethodAccessor的invoke中,深刻MethodAccessor