是什么
首先清楚代理是什么个什么东西。
顾明思议,代理即通过其他的方式去完成一件事。
生活中上网的时候,我们可能会去买东西,但是有时候不方便或者没空的时候,获取就会叫朋友帮忙去买。这时候我们也可以理解为代理。别人代替你去做一件事。
怎么做
在java中,代理分多种。这里讨论的是jdk中自带的方式,动态代理。这个在很多框架的实现中都会用到的技术。
关键类
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
顾名思义,Invokationhandler就是被代理对象的方法被invoke是的handle 逻辑所在
这个接口就是每个需要实现代理的功能核心所在
每次代理对象的目标方法被唤起的时候,都会调用这个invoke方法
我们来剖析一下这个方法的各个参数:
- proxy:执行时,已经代理的对象。
- Method: 被代理的方法
- args:被代理的方法参数
通常在invoke方法中,很少去动proxy参数。主要是针对method 和 args 做动作。
怎么创建代理
Proxy.newProxyInstance(A.class.getClassLoader(), A.class.getInterfaces(), new LogInvocationHandler(objectToBeProxied));
使用Proxy.newProxyInstance去创建代理对象。主要的参数为第二个,和第三个。
第二个为代理需要实现的接口,可以多个。
第三个为实现的InvocationHandler, 通常handler 里面的实现,需要和被代理的对象进行绑定调用。因为通常要用到Method.invoke(targe,args) 方法。
创建代理之后,就可以使用代理调用相关的方法。
完整测试代码
下面是完成的测试代码,可以做相应的修改测试
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public static interface SayHello {
String hello();
}
public static class DefaultHello implements SayHello {
@Override
public String hello() {
return "hello";
}
}
static class LogInvocationHandler implements InvocationHandler {
private Object target;
public LogInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("make some log");
return method.invoke(target, args);
}
}
public static void main(String[] args) {
SayHello defaultHello = new DefaultHello();
SayHello hello = (SayHello) Proxy.newProxyInstance(DefaultHello.class.getClassLoader(), DefaultHello.class.getInterfaces(), new LogInvocationHandler(defaultHello));
System.out.println(hello.hello());
}
}
网友评论