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