代理

  1. 代理分为静态代理和动态代理两种。
  2. 静态代理,代理类需要自己编写代码写成。
  3. 动态代理,代理类通过 Proxy.newInstance() 方法生成。
  4. 不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。
  5. 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
  6. 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
  7. 代理模式本质上的目的是为了增强现有代码的功能。
    public interface Image {
        void  display();
    }
    ***************************************************
    public class RealImage implements Image {
    
        private String fileName;
    
        public RealImage(String fileName){
            this.fileName = fileName;
            loadFromDisk(fileName);
        }
    
        @Override
        public void display() {
            System.out.println("Displaying " + fileName);
        }
    
        private void loadFromDisk(String fileName){
            System.out.println("Loading " + fileName);
        }
    }
    **************************************************
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class MyInvocationHandler implements InvocationHandler {
        RealImage realImage;
        public MyInvocationHandler(RealImage realImage) {
        this.realImage=realImage;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("调用代理类");
            if(method.getName().equals("display")){
                 method.invoke(realImage, args);
                System.out.println("调用的是卖书的方法");
                return null ;
            }else {
                String string = (String) method.invoke(realImage,args) ;
                System.out.println("调用的是说话的方法");
                return  string ;
            }
        }
    }
    ****************************************************
    import java.lang.reflect.Proxy;
    
    public class Main {
        public static void main(String[] args) {
            RealImage realImage=new RealImage("dada");
            MyInvocationHandler myInvocationHandler=new MyInvocationHandler(realImage);
            Image proxyclass=(Image) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Image.class}, myInvocationHandler);
            proxyclass.display();
            System.out.println(proxyclass.getClass().getName());
    
        }
    }

     

posted @ 2021-10-21 13:25  老运维  阅读(136)  评论(0)    收藏  举报