zoukankan      html  css  js  c++  java
  • java静态代理和动态代理

    参考: https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

     也可以看看这个文章:http://blog.csdn.net/pangqiandou/article/details/52964066

    public interface Subject {
    
        public void rent();
    
        public void hello(String str);
    
    }
    public class RealSubject implements Subject {
        @Override
        public void rent() {
            System.out.println("I want to rent my house");
        }
    
        @Override
        public void hello(String str) {
            System.out.println("hello: " + str);
        }
    }

    静态代理:

    /**
     * @author lishupeng
     * @Description
     * @Date 2017/12/9 17:38
     * <p>
     * <p>
     * 静态代理
     */
    public class StaticProxy implements Subject {
    
        private Subject subject = new RealSubject();
    
        @Override
        public void rent() {
    
        }
    
        @Override
        public void hello(String str) {
            System.out.println("静态代理前置内容");
            subject.hello(str);
            System.out.println("静态代理后置内容");
        }
    
    
        public static void main(String[] args) {
            StaticProxy proxy = new StaticProxy();
            proxy.hello("lsp");
        }
    }

    动态代理:

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * @author lishupeng
     * @Description
     * @Date 2017/12/9 17:12
     * <p>
     * 动态代理类
     */
    public class DynamicProxy implements InvocationHandler {
    
    
        // 这个就是我们要代理的真实对象
        private Object subject;
    
    
        //    构造方法,给我们要代理的真实对象赋初值
        public DynamicProxy(Object subject) {
            this.subject = subject;
        }
    
    
        /**
         * @param proxy  指代我们所代理的那个真实对象
         * @param method 指代的是我们所要调用真实对象的某个方法的Method对象
         * @param args   指代的是调用真实对象某个方法时接受的参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            //  在代理真实对象前我们可以添加一些自己的操作
            System.out.println("before rent house");
    
            System.out.println("Method:" + method);
    
            // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
            method.invoke(subject, args);
    
            //  在代理真实对象后我们也可以添加一些自己的操作
            System.out.println("after rent house");
    
            return null;
        }
    
    
        public static void main(String[] args) {
            //    我们要代理的真实对象
            Subject realSubject = new RealSubject();
    
            //    我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
            InvocationHandler handler = new DynamicProxy(realSubject);
            /*
             * 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
             * 第一个参数 handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
             * 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
             * 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
             */
            Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject
                    .getClass().getInterfaces(), handler);
    
            System.out.println(subject.getClass().getName());
            subject.rent();
            subject.hello("world");
        }
    }
  • 相关阅读:
    蠢货之对闭包表的扩展
    蠢货之TaskCompletionSource 带事件的同步调用
    SQLSERVER新建存储过程模板
    缓存更新
    写给”源码爱好者“
    区块链-一个不神秘却总能骗人的东西
    graceful-upgrades-in-go
    谁也逃不过C++
    Go的问题
    面试
  • 原文地址:https://www.cnblogs.com/lishupeng/p/8012145.html
Copyright © 2011-2022 走看看