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

    /**
     * 被代理类(猫)
     */
    public class Cat implements Action{
    
        @Override
        public void eat(){
            System.out.println("猫吃饭了!");
        }
    }
    /**
     * 静态代理需要自己写代理类-->代理类需要实现与目标对象相同的接口
     */
    public interface Action {
        //吃饭的动作
        void eat();
    }
    /**
     *  代理类(铲屎官) --- 静态代理
     */
    public class ProxyDemo implements Action{
    
        private Cat cat;
    
        public ProxyDemo(Cat cat){
            this.cat = cat;
        }
    
        //透明代理
        public ProxyDemo(){
            this.cat = new Cat();
        }
    
        public void clear(){
            System.out.println("猫吃完了,要给它铲屎!");
        }
    
        @Override
        public void eat(){
            cat.eat();
            clear();
        }
    
        public static void main(String[] args) {
            //吃饭的猫
            Cat cat = new Cat();
            //受委托的猫
            ProxyDemo proxyDemo = new ProxyDemo(cat);
            //猫让代理类(铲屎官)来铲屎
            proxyDemo.eat();
    
            //透明代理
            ProxyDemo proxyDemo1 = new ProxyDemo();
            proxyDemo.eat();
        }
    }

    动态代理:

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * 动态代理
     */
    public class DynamicProxy implements InvocationHandler {
    
        private Object object;
    
        public DynamicProxy(Object object){
            this.object = object;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Before invoke "  + method.getName());
            method.invoke(object, args);
            System.out.println("After invoke " + method.getName());
            return null;
        }
    
        public static void main(String[] args1) {
            //saveGeneratedFiles:是否保存生成的代理类class文件,默认false不保存
            System.getProperties().setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
            Action action = new Cat();
            InvocationHandler handler = new DynamicProxy(action);
            Action proxyCat = (Action) Proxy.newProxyInstance(action.getClass().getClassLoader(), action.getClass().getInterfaces(), handler);
            //猫吃饭前后插入两个输出日志
            proxyCat.eat();
        }
    }
  • 相关阅读:
    分布式基础学习(1)--分布式文件系统
    吞吐量(Throughput)、QPS、并发数、响应时间(RT)对系统性能的影响
    单点登录SSO的实现原理
    Java基础学习总结——Java对象的序列化和反序列化
    谈谈Memcached与Redis
    Java并发集合的实现原理
    Head First 设计模式 第4章工厂模式
    CentOS Linux 系统 英文 改中文
    Red Hat 9.0 Linux 分辨率修改
    Head First 设计模式 第5章 单例模式
  • 原文地址:https://www.cnblogs.com/cat520/p/13096348.html
Copyright © 2011-2022 走看看