设计模式之--动态代理

动态代理,就是一个类首先是接口或者抽象类,这个类被具体类实现,我们想生成该类的代理,在产生代理的时候,可以在产生的过中动态的增加业务逻辑。

我们使用JDK自带的InvocationHandler 和Proxy类来实现动态代理。

如果被代理的类没有实现接口,我们使用cglib 直接生成二进制的代码。

Spring的AOP就是使用的这个接口来实现的面向切面编程。



以下是一个例子,在正常的业务前面,增加一个日志。

package dynamicAgent;


public interface Subject {
abstract public void request();
}

package dynamicAgent;


public class RealSubject implements Subject{


public void request() {
System.out.println("我是被代理对象");
}
}

package dynamicAgent;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class DynamicSubject implements InvocationHandler{


private Object obj;

public void setObj(Object obj) {
this.obj = obj;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
   Log.log();
   method.invoke(obj, args);
return null;
}
}

package dynamicAgent;


public class Log {


public static void log(){
System.out.println("我正在记录日志");
}
}

package dynamicAgent;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class DynamicSubject implements InvocationHandler{


private Object obj;

public void setObj(Object obj) {
this.obj = obj;
}




public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
   Log.log();
   method.invoke(obj, args);
return null;
}
}

package dynamicAgent;


import java.lang.reflect.Proxy;


public class Client {


/**
* @param args
*/
public static void main(String[] args) {
        Subject sub=new RealSubject();
        
        DynamicSubject ih=new DynamicSubject();
        ih.setObj(sub);
        
        Subject proxy=(Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(), sub.getClass().getInterfaces(),ih );
        
       System.out.println(sub);
        System.out.println(proxy);
        proxy.request();
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值