博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《设计模式之禅》--代理扩展:动态代理
阅读量:6235 次
发布时间:2019-06-22

本文共 2500 字,大约阅读时间需要 8 分钟。

接上篇

动态代理就是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。相对来说,自己写代理类的方式就是静态代理

面向切面编程(AOP)核心就是采用了动态代理机制

public interface Subject {    //业务操作    public void doSomething(String str);}
public class RealSubject implements Subject {    //业务操作    public void doSomething(String str) {        System.out.println("do something!---->" + str);    }}
public class MyInvocationHandler implements InvocationHandler {    //被代理的对象    private Object target = null;    //通过构造函数传递一个对象    public MyInvocationHandler(Object _obj) {        this.target = _obj;    }    //代理方法    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        //执行被代理的方法        return method.invoke(this.target, args);    }}
public class DynamicProxy
{ public static
T newProxyInstance(ClassLoader loader, Class
[] interfaces, InvocationHandler h) { //寻找JoinPoint连接点,AOP框架使用元数据定义 if (true) { //执行一个前置通知 (new BeforeAdvice()).exec(); } //执行目标,并返回结果 return (T) Proxy.newProxyInstance(loader, interfaces, h); }}
public interface IAdvice {    //通知只有一个方法,执行即可    public void exec();}public class BeforeAdvice implements IAdvice {    public void exec() {        System.out.println("我是前置通知,我被执行了!");    }}

调用

public class Client {    public static void main(String[] args) {        //定义一个主题        Subject subject = new RealSubject();        //定义一个Handler        InvocationHandler handler = new MyInvocationHandler(subject);        //定义主题的代理        Subject proxy = DynamicProxy.newProxyInstance(subject.getClass().                getClassLoader(), subject.getClass().getInterfaces(), handler);        //代理的行为        proxy.doSomething("Finish");    }}

结果

我是前置通知,我被执行了!do something!---->Finish

拓展:

public class SubjectDynamicProxy extends DynamicProxy {    public static 
T newProxyInstance(Subject subject) { //获得ClassLoader ClassLoader loader = subject.getClass().getClassLoader(); //获得接口数组 Class
[] classes = subject.getClass().getInterfaces(); //获得handler InvocationHandler handler = new MyInvocationHandler(subject); return newProxyInstance(loader, classes, handler); }}

 调用

public class Client {    public static void main(String[] args) {        //定义一个主题        Subject subject = new RealSubject();        //定义主题的代理        Subject proxy = SubjectDynamicProxy.newProxyInstance(subject);        //代理的行为        proxy.doSomething("Finish");    }}

 

转载地址:http://spqna.baihongyu.com/

你可能感兴趣的文章
关于Unity中的模型描边与Shader切换(专题二)
查看>>
《淘宝技术这十年》读后感
查看>>
程序员经常加班的真正原因
查看>>
windows系统下如何正确安装Cygwin(图文详解)
查看>>
SpringBoot接口服务处理Whitelabel Error Page
查看>>
mysql创建唯一索引
查看>>
Vijos1935不可思议的清晨题解
查看>>
Android Studio修改默认Activity继承AppCompatActivity
查看>>
Servlet和Android网络交互基础(3)
查看>>
javascript:void(0) 含义
查看>>
<<、|=、&的小例子
查看>>
愿Linux红帽旋风吹得更加猛烈吧!
查看>>
Secret Code
查看>>
Vue动态组件
查看>>
ES2017异步函数现已正式可用
查看>>
DBA-io
查看>>
【转】批处理常用符号详解
查看>>
Uncaught TypeError: jQuery.i18n.browserLang is not a function
查看>>
JavaScript中的闭包详解
查看>>
【JSP】JSP Action动作标签
查看>>