Java动态代理

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只能代理接口的问题。原理也是通过继承来重新父类方法,才能达到重写的效果。

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JDK动态代理和Cglib的动态代理

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。重点说一下JDK的动态代理和Cglib的动态代理吧先说JDK的,需要被代理的类需要有接口,否则无法实现package proxy.dynamic;public interface IBook {void add();}实现接口

CGLIB介绍与原理(通过继承的动态代理)

一、什么是CGLIB?CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。二、CGLIB原理CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的

Spring的两种代理JDK和CGLIB的区别浅谈

一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以

CGLIB代理基础

  本文意在讲解CGLIB的基础使用及基本原理。一、CGLIB的基本原理:  依赖ASM字节码工具,通过动态生成实现接口或继承类的类字节码,实现动态代理。  针对接口,生成实现接口的类,即implements方式;针对类,生成继承父类的类,即extends方式。二、为什么使用CGLIB?  JDK的动态代理只能基于接口,有时候我们想基于类