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