zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    jsp生成xml文件示例
    jsp分页显示
    Spring AOP学习笔记
    让leeon不再眷念马桶——书评《精通正则表达式》
    用JSP实现上传文件的两种方法
    oracle sql性能优化
    Iron Speed Designer 4.2.2学习
    再议《JavaScript代码优化一例》
    有关《大道至简》的几点讨论~
    有源则至清——我读《移山之道》
  • 原文地址:https://www.cnblogs.com/xubiao/p/4170669.html
Copyright © 2011-2022 走看看