zoukankan      html  css  js  c++  java
  • 设计模式之动态代理(JDK代理)

      动态代理跟静态代理一个很重要的区别在于,动态代理是在内存是中的,是在代码编译期后在内存是实现的,而静态代理是我们自己编写代理类,编译后生成class文件。动态代理需要借助两个类:java.lang.reflect.InvocationHandler和java.lang.reflect.Proxy。我们还是以上边的例子来实现动态代理。首先需要创建一个类,并实现java.lang.reflect.InvocationHandler接口

    • java.lang.reflect.Proxy:生成动态代理类和对象;
    •  java.lang.reflect.InvocationHandler(处理器接口):可以通过invoke方法实现 

    接口:Subject.java

    **
     * @author aaron
     */
    public interface Subject {
        public int sellBooks();
    
        public String speak();
    }

     真实对象:RealSubject.java

    /**
     * @author aaron
     */
    public class RealSubject implements Subject{
        @Override
        public int sellBooks() {
            System.out.println("卖书");
            return 1 ;
        }
    
        @Override
        public String speak() {
            System.out.println("说话");
            return "张三";
        }
    }

    处理器对象:MyInvocationHandler.java

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * 定义一个处理器
     * 
     * @author aaron
     */
    public class MyInvocationHandler implements InvocationHandler {
        /**
         * 因为需要处理真实角色,所以要把真实角色传进来
         */
        Subject realSubject;
    
        public MyInvocationHandler(Subject realSubject) {
            this.realSubject = realSubject;
        }
    
        /**
         *
         * @param proxy
         *            代理类
         * @param method
         *            正在调用的方法
         * @param args
         *            方法的参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("在被代理类之前做事情");
            // 类似于Spring AOP 中的@Before
            Object invoke = (int) method.invoke(realSubject, args);
            // 类似于Spring AOP 中的@after
            System.out.println("在被代理类之后做事情");
            return invoke;
        }
    
    }

    测试类:Client.java

    import java.lang.reflect.Proxy;
    
    /**
     * 调用类
     * @author aaron
     */
    public class Client {
        public static void main(String[] args) {
            //真实对象
            Subject realSubject =  new RealSubject();
    
            MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);
            //代理对象
            Subject proxyClass = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Subject.class}, myInvocationHandler);
    
            proxyClass.sellBooks();
    
            proxyClass.speak();
        }
    }
  • 相关阅读:
    GoldenGate配置(一)之单向复制配置
    Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发
    Linux用户及用户组设置
    HDU1013_Digital Roots【大数】【水题】
    随意一条查询sql转换为查询结果集相应的数目
    对文件地址的几种概念的理解
    2014-10深圳全球架构师峰会
    有沃更精彩,沃课堂理想的移动学习平台
    自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
    Inno Setup入门(二)——修改安装过程中的图片
  • 原文地址:https://www.cnblogs.com/JavaHxm/p/10767948.html
Copyright © 2011-2022 走看看