动态代理系列(三)动态代理换种玩法
2018-09-16 本文已影响0人
关捷
从上一讲动态代理,其实我们可以猜测到,代理类的生成需要接口,那么代理类肯定也是实现那个接口。
到现在为止,我们看到的目标类同样实现了那个接口,但是目标类一定需要实现接口吗?或者说过目标类一定需要吗?
我们举一个例子:
public class ClientObj {
public static void main(String[] args) {
TargetObjIntf proxyObj = getProxy(TargetObjIntf.class);
proxyObj.select();
proxyObj.http(Arrays.asList("abc"));
}
//生成代理类
private static <T> T getProxy(Class<T> clazz) {
return (T) Proxy.newProxyInstance(clazz.getClassLoader(),
new Class[]{clazz}, new ProxyObjHandler());
}
interface TargetObjIntf {
void select();
void http(List<String> list);
}
/**
* 统一的增强逻辑
*/
static class ProxyObjHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("select")) {
System.out.println("jdbc查数据库返回List");
return Collections.EMPTY_LIST;
}
if (method.getName().equals("http")) {
System.out.println("HTTP调用返回" + args[0]);
return Collections.EMPTY_MAP;
}
return null;
}
}
}
执行结果:
jdbc查数据库返回List
HTTP调用返回[abc]
看到了吗,不需要目标类一样可以使用动态代理。
很多同学可能似曾相识了,没错,这就是Mybatis或者RPC通过接口进行调用的原理,通过中央处理器进行处理,动态代理进行包装。