- 靜態(tài)編譯:AspectJ,生成的是class文件,class文件的類名和原來(lái)的類名是相同的。
- 動(dòng)態(tài)生成:JDK(如果有兩個(gè)接口不是public且包不相同,則拋異常)和cglib
JDK動(dòng)態(tài)代理
- 如果有一個(gè)接口不是public,代理類就不是public,如果兩個(gè)接口都不是public而且包名不同,則拋異常。
- 代理類繼承了Proxy方法。
- 下面是生成代理類的核心,ProxyGenerator方法的這個(gè)類是public。
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);
protected Proxy(InvocationHandler h):構(gòu)造函數(shù),用于給內(nèi)部的h賦值。
static Class getProxyClass (ClassLoaderloader, Class[] interfaces):獲得一個(gè)代理類,其中l(wèi)oader是類裝載器,interfaces是真實(shí)類所擁有的全部接口的數(shù)組。
static Object newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h):返回代理類的一個(gè)實(shí)例,返回后的代理類可以當(dāng)作被代理類使用(可使用被代理類的在Subject接口中聲明過(guò)的方法)