最近做RPC框架,需要对接口生成代理类,使得客户端在调用接口方法的时候,执行代理类方法的对应逻辑,这里先记录,待后续整理。
使用JDK的Proxy实现的动态代理
@SuppressWarnings("unchecked")
public <T> T create(Class<?> interfaceClass) {
return (T) Proxy.newProxyInstance(
interfaceClass.getClassLoader(),
new Class<?>[]{interfaceClass},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(Object.class == method.getDeclaringClass()) {
String name = method.getName();
if("equals".equals(name)) {
return proxy == args[0];
} else if("hashCode".equals(name)) {
return System.identityHashCode(proxy);
} else if("toString".equals(name)) {
return proxy.getClass().getName() + "@" +
Integer.toHexString(System.identityHashCode(proxy)) +
", with InvocationHandler " + this;
} else {
throw new IllegalStateException(String.valueOf(method));
}
}
RpcRequest rpcRequest = new RpcRequest(); // 创建并初始化 RPC 请求
// TODO:生成RequestId的策略
rpcRequest.setRequestId(System.identityHashCode(rpcRequest));
rpcRequest.setClassName(method.getDeclaringClass().getName());
rpcRequest.setMethodName(method.getName());
rpcRequest.setParameterTypes(method.getParameterTypes());
rpcRequest.setParameters(args);
RpcFuture rpcFuture = rpcClient.doRpc(rpcRequest); // 通过 RPC 客户端发送 RPC 请求并获取 RPC 响应
return rpcFuture.get(3000, TimeUnit.MILLISECONDS);
}
}
);
}
使用CGlib实现的动态代理
@SuppressWarnings("unchecked")
public <T> T create(Class<?> interfaceClass) {
// 声明增加类实例
Enhancer en = new Enhancer();
// 设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
en.setSuperclass(interfaceClass);
// 设置回调函数,即一个方法拦截
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
// 处理Object类中的几个方法的情况
if (Object.class == method.getDeclaringClass()) {
String name = method.getName();
if ("equals".equals(name)) {
return arg0 == args[0];
} else if ("hashCode".equals(name)) {
return System.identityHashCode(arg0);
} else if ("toString".equals(name)) {
return arg0.getClass().getName() + "@" +
Integer.toHexString(System.identityHashCode(arg0)) +
", with InvocationHandler " + this;
} else {
throw new IllegalStateException(String.valueOf(method));
}
}
// 创建并初始化 RPC 请求
RpcRequest rpcRequest = new RpcRequest();
rpcRequest.setRequestId(System.identityHashCode(rpcRequest));
rpcRequest.setClassName(method.getDeclaringClass().getName());
rpcRequest.setMethodName(method.getName());
rpcRequest.setParameterTypes(method.getParameterTypes());
rpcRequest.setParameters(args);
// 通过 RPC 客户端发送 RPC 请求并获取 RPC 响应
RpcFuture rpcFuture = rpcClient.doRpc(rpcRequest);
return rpcFuture.get(3000, TimeUnit.MILLISECONDS);
}
});
return (T) en.create();
}