• java的代理和动态代理简单测试


    什么叫代理与动态代理?

    1.以买火车票多的生活实例说明。

    因为天天调bug所以我没有时间去火车票,然后就给火车票代理商打电话订票,然后代理商就去火车站给我买票。就这么理解,需要我做的事情,代理商帮我办了,但是需要出手续费。

    废话不说了,直接上java代码吧!

    java动态代理

    //接口   (抽象买票的事情)

     public interface ICalc {
         public int add(int i, int j);
    }
    //实现这个接口   (具体到我买票的事情)

    public class CalcImpl implements ICalc {

        @Override
        public int add(int i,int j) {
            int result = i + j;
            return result;
        }
    }

    //动态创建代理对象   (代理商具备买票的能力,只要我打电话就可以了)

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.ArrayList;
    import java.util.Arrays;

    public class CalcLoggingProxy  implements InvocationHandler {
        //被代理对象
        private ICalc target;
        public CalcLoggingProxy(){}
        public CalcLoggingProxy(ICalc obj){
            target = obj;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
               String methodName = method.getName();
               //日志
               System.out.println("invoke...before---> "+methodName+"---"+Arrays.asList(args));
               //执行方法
               Object  result = method.invoke(target,args);
               //日志
               System.out.println("invoke...after---->"+result);
            return result;
        }
        
        public static Object factory1(ICalc target)
          {
                //获取被代理对象的Class
                Class cls = target.getClass();
                //代理对象由哪一个类加载器负责
                ClassLoader loader = cls.getClassLoader();
                //代理对象的类型,即其中有哪些方法
                Class [] interfaces = new Class[]{ICalc.class};
                //当调用代理对象的方法时执行该代码--->先给代理对象赋值--->自动调用invoke();
                InvocationHandler handler = new CalcLoggingProxy(target);
                //返回代理对象的实例
                return Proxy.newProxyInstance(loader,interfaces,handler);
           }
         
    }
    //测试   (我就打了个电话去订票)
    public class ProxyTest {
           public static void main(String[] args) {
             ICalc target = new CalcImpl();
             ICalc calcproxy =  (ICalc) CalcLoggingProxy.factory1(target);
             int result =  calcproxy.add(2, 4);
             System.out.println(result);
        }
    }

    //测试效果  (然后就有票了)

    invoke...before---> add---[2, 4]
    invoke...after---->6
    6

  • 相关阅读:
    RQNOJ 342 最不听话的机器人:网格dp
    RQNOJ 329 刘翔!加油!:01背包
    RQNOJ 57 找啊找啊找GF:01背包
    RQNOJ 202 奥运火炬登珠峰:01背包
    RQNOJ 201 奥运大包围:LIS + 拼链成环
    2017SN多校D1T2 note:dp
    2017SN多校D1T1 loveletter:模拟
    HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】
    poj 3764 The xor-longest Path
    bzoj 1192 鬼谷子的钱袋
  • 原文地址:https://www.cnblogs.com/xubiao/p/4170669.html
Copyright © 2020-2023  润新知