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();
        }
    }
  • 相关阅读:
    bzoj 3670: [Noi2014]动物园
    bzoj 2878: [Noi2012]迷失游乐园
    51nod 1348 乘积之和
    51nod 1514 美妙的序列
    AtCoder Grand Contest 002 D
    bzoj 3451 Normal
    LOJ #6119. 「2017 山东二轮集训 Day7」国王
    51nod 1752 哈希统计
    计蒜客 百度地图的实时路况
    Codeforces 549F Yura and Developers
  • 原文地址:https://www.cnblogs.com/JavaHxm/p/10767948.html
Copyright © 2011-2022 走看看