- 静态编译:AspectJ,生成的是class文件,class文件的类名和原来的类名是相同的。
- 动态生成:JDK(如果有两个接口不是public且包不相同,则抛异常)和cglib
JDK动态代理
- 如果有一个接口不是public,代理类就不是public,如果两个接口都不是public而且包名不同,则抛异常。
- 代理类继承了Proxy方法。
- 下面是生成代理类的核心,ProxyGenerator方法的这个类是public。
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);
protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。
static Class getProxyClass (ClassLoaderloader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
static Object newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)