[toc]
前言
关于动态代理的知识, 这里不再过多说明这里要介绍的是, 如何创建一个可自适应任意接口的动态代理对象的通用方法, 也就是说, 引用对象可为任意接口, 举个例子, 假如返回动态代理对象的方法是 getProxy, 而同时存在两个接口 UserInterface 和 ProductInterface, 这时可以这样使用:
- UserInterface user = getProxy(UserInterface.class);
- ProductInterface product = getProxy(ProductInterface.class);
即不管接口类型是什么, 都可以使用 getProxy() 方法来创建动态代理对象, 创建这样一个方法的意义对于构建自己的 RPC 框架是非常重大的, 因为实际可以在 getProxy() 方法中嵌入远程过程调用客户端的代码, 向服务端发出远程调用的请求, 以实现远程过程调用的目的
通用方法 getProxy()
代码如下:
- @SuppressWarnings("unchecked")
- public static <T> T getProxy(Class<?> interfaceClass) {
- T proxy = (T) Proxy.newProxyInstance(TestProxy.class.getClassLoader(), new Class<?>[]{interfaceClass}, new InvocationHandler() {
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String methodName = method.getName();
- System.out.println("调用的方法名是:" + methodName);
- return null;
- }
- });
- return proxy;
- }
测试
假如这里有两个接口, 分别为 UserInterface 和 ProductInterface, 代码如下:
- UserInterface
- package cn.xpleaf.service;
- public interface UserInterface {
- public void getUsername();
- }
- ProductInterface
- package cn.xpleaf.service;
- public interface ProductInterface {
- public void getProduct();
- }
测试代码如下:
- @Test
- public void testGetProxy() {
- UserInterface user = getProxy(UserInterface.class);
- ProductInterface product = getProxy(ProductInterface.class);
- user.getUsername();
- product.getProduct();
- }
输出结果如下:
调用的方法名是: getUsername
调用的方法名是: getProduct
实际应用
后面在进行开发 RPC 框架时将会充分用到这个通用的方法, 在 invoke 方法中, 就可以嵌入我们向服务端发送远程调用请求的代码, 从而实现远程调用的目的, 而底层通信可以使用 socket, 当然也可以前面一直在探索的 netty, 不过出于性能上的考虑, 当然会首选 netty
来源: http://www.bubuko.com/infodetail-2510932.html