首页 > 代码库 > 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

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