http://www.cnblogs.com/MOBIN/p/5597215.html 請先查看這邊博文 此文主要是在上篇博文的基礎之上,巨集觀的理一下思路,因為之前本人看了上篇之後雲里霧裡(是本人技術不到位)。然後研究了一會兒jdk1.8的源碼之後寫了此篇,不是很準確,源碼上篇博文之中已經很多了,我 ...
此文主要是在上篇博文的基礎之上,巨集觀的理一下思路,因為之前本人看了上篇之後雲里霧裡(是本人技術不到位)。然後研究了一會兒jdk1.8的源碼之後寫了此篇,不是很準確,源碼上篇博文之中已經很多了,我就不加了。
1、 獲取代理對象,需要傳入類載入器,需要被實現的介面, InvocationHandler對象(該對象中,包含了我們自己編寫的介面實現類實例,也就是未被代理的業務邏輯。比如有UserServieImpl實例,也就是target)。 調用的是 Proxy類中的newProxyInstance(classloader,interfaces,invocationHandler)方法來獲取代理類的實例。 2、繼續看 newProxyInstance 方法中,調用 getProxyClass0(loader,interfaces)來獲取代理類的class對象(內部是類載入器載入了生成的位元組碼產生了該代理類的class對象),然後通過該class對象來獲取getConstructor(constructorParams)構造方法,然後傳入InvocationHandler對象來實例化代理對象並返回。 3、 getProxyClass0方法中主要實現的邏輯是,獲取介面中的方法method(反射),將介面的包名全路徑,方法名記錄下來,在代理類中實現(通過位元組碼的方式,可以研究源碼),通過static靜態代碼塊的方式,將method通過反射的方式註入到代理類中m1,m2,m3等,同時還實現了equals,hashcode等方法,最後通過傳入的InvocationHandler對象,來調用this.h.invoke(this, method, null); 方法 this就是代理類對象,method是通過靜態註入獲取到的method對象,是介面所定義的。 在我們實現的InvocationHandler對象中實現瞭如下方法@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“—– before —–“); Object result = method.invoke(target, args); System.out.println(“—– after —–“); return result; }
其中:proxy是代理類實例,method是介面中的方法對象,也是在代理類中實現的當前方法,是代理類實現介面方法的時候作為參數傳遞過來的,args是參數,方法沒有入參則為null method.invoke(target,args)是java反射中的方法.target是介面實現類的實例(也就是比如的UserServiceImpl),method是介面定義的方法。