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

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    //动态代理的使用
    interface Subject {
        void action();
    }
    
    // 被代理类
    class RealSubject implements Subject {
    
        @Override
        public void action() {
            System.out.println("我是被代理类,我一定要被执行!");
        }
    
    }
    
    // 代理类
    class MyInvocationHandler implements InvocationHandler {
    
        Object object; // 实现了接口的被代理类的对象的声明
    
        // ①给被代理的对象实例化②返回一个代理类的对象
        public Object blind(Object obj) {
            this.object = obj;
            return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                    object.getClass().getInterfaces(), this);
        }
        
        //当通过代理类的对象发起对重写的方法的调用时,都会转为对如下的invoke方法的调用
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            //method方法的返回值是returnVal
            Object returnVal = method.invoke(object, args);
            return returnVal;
        }
    
    }
    
    public class TestProxy {
        public static void main(String[] args) {
            //1.被代理的对象
            RealSubject real = new RealSubject();
            //2.创建一个实现了InvocationHandler接口类的对象
            MyInvocationHandler handler =new MyInvocationHandler();
            //3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
            Object obj = handler.blind(real);
            Subject sub = (Subject)obj; //此时sub就是代理类的对象
            sub.action();//转到对InvacationHandler接口的实现类的invoke()方法的调用
            
            
        }
    }
  • 相关阅读:
    POI数据类型转换
    RSA加密解密——绕过OpenSSL
    STS热部署,springboot项目中修改代码不用重新启动服务
    List || Lists
    java解析复杂json数据
    Sublime Text 3 全程详细图文原创教程
    SpringBoot外调的几种方式 || http、https配置
    JPA对原生SQL的支持
    基于UDP协议的网络编程
    基于TCP协议的网络编程
  • 原文地址:https://www.cnblogs.com/wxf-com/p/7898482.html
Copyright © 2011-2022 走看看