java动态代理

点击量:41

主要介绍java两种动态代理方式的原理以及使用方式 jdk自带动态代理和CGLIB动态代理

动态代理

动态代理就是通过代理的方式对需要的类方法进行加强

常用的两种方式:

1.JDK自带的代理方式 2.CGLIB方式

需要相关类实现接口 需要相关类不是final修饰

JDK自带的代理方式:

1. 创建代理类 实现 InvocationHandler接口
    a.代理类要能接收:真实类的实例对象

b.实现invok 方法,在invoke方法中对具体的方法进行增强

c.代理类中写一个方法用于获取代理对象

Proxy.newProxyInstance(类加载器,接口,this)

2.在测试方法中将代理类实例化
  a.传入实际对象

b.获取代理对象

3.执行代理对象的相关方法

具体代码:

代理类

public class MyProxy implements InvocationHandler{

   private  Object object;

   public MyProxy**(Object obj){

       super();

       this.object=obj;

  }

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

       System.out.println("this is write by my own");

       Object invoke = method.invoke(object, args);

       System.out.println("proxy is over");

       return invoke;

  }

   public Object getInstance(){

       return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);

  }

}

测试

doing ado=new doing();

MyProxy myProxy=new MyProxy(ado);

DoSomething instance = (DoSomething) myProxy.getInstance();

instance.sing();

CGLIB方式:

1.创建代理类 实现 MethodInterceptor接口

2.实现intercept方法,在intercept中对相应的方法进行增强

3.在代理类写一个方法用于获取方法并接收要增强的对象

创建Enhencer对象,

使用 enhencer.setSuperclass(xxx) 将要增强的对象传入

使用 enhencer.setCallback()(new 当前代理类)

代理类

public class CglibProxy implements MethodInterceptor {

   public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

       System.out.println("xxxxxxxxxxxxxxxxxxxxxxxx");

       Object o1 = methodProxy.invokeSuper(o, objects);

       System.out.println("xxxxxxxxxxxxxxxxxxxxxxxx");

       return o1;

  }

   public Object getProxy(Class clazz){

       Enhancer enhancer=new Enhancer();

       enhancer.setSuperclass(clazz);

       enhancer.setCallback(new CglibProxy());

       return enhancer.create();

  }

}

测试

CglibProxy cglibProxy=new CglibProxy();

doing2 proxy = (doing2)cglibProxy.getProxy(doing2.class);

proxy.sing();


感谢您的阅读
文章由作者个人总结,欢迎指出文章错误

1楼  泰斯特  2019-05-26 11:44

不错,加油啊




上一篇:VIM快捷键

下一篇:SQL基本操作