jdk动态代理
实现原理:利用字节码技术,生成新的class文件,来达到动态代理效果。
新的class文件是怎么组织的?由于代理目标是接口,则通过实现接口和继续代理类来完成。看看下面的例子更容易明白。
demo 接口
1public interface PeoPleInterface { 2 3 void say() throws Throwable; 4} 5
实现类
1public class GrilPeoPle implements PeoPleInterface { 2 @Override 3 public void say() { 4 System.out.println("女人说"); 5 } 6}
代理类
1public class PeoPleInvacationHandler implements InvocationHandler { 2 3 private Object obj; 4 5 public PeoPleInvacationHandler(Object obj) { 6 this.obj = obj; 7 } 8 9 @Override 10 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 11 System.out.println("人类开始"); 12 Object invoke = method.invoke(obj, args); 13 System.out.println("人类结束"); 14 return invoke; 15 } 16}
最终产生的类。这个类就是$Proxy0的实现原理。这个类是通过字节码生成的。
1public class PeoPleProxy extends PeoPleInvacationHandler implements PeoPleInterface { 2 3 public PeoPleProxy(Object obj) { 4 super(obj); 5 } 6 7 @Override 8 public void say() throws Throwable { 9 // 调用目标方法 10 super.invoke(this,PeoPleInterface.class.getMethod("say",null),null); 11 } 12 13 public static void main(String[] args) { 14 PeoPleInterface grilPeoPle = new GrilPeoPle(); 15 PeoPleProxy proxy =new PeoPleProxy(grilPeoPle); 16 try { 17 proxy.say(); 18 } catch (Throwable throwable) { 19 throwable.printStackTrace(); 20 } 21 } 22}
cglib动态代理
cglib 是代理类的,针对于jdk只能代理接口的问题。原理也是通过继承来重新父类方法,才能达到重写的效果。