JAVA动态代理
Hadoop里的RPC实现就是用动态代理实现的。
现在来看下一个简单的动态代理实现:
package cn.bestot; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface TI{ public final static String name = "TI"; public String test(int a,String b); } class Invoker implements InvocationHandler{ private String cls; public Invoker(Class cls){ this.cls = cls.getName(); } @Override public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable{ String name = method.getName(); System.out.println(this.cls+":"+name); System.out.println(arg); return null; } } class MyProxy{ public static Object newInstance(Class cls){ Invoker invoker = new Invoker(cls); return Proxy.newProxyInstance(cls.getClassLoader(), new Class[]{cls}, invoker); } } public class TestInterface { public static void main(String[] args){ TI ti = (TI)MyProxy.newInstance(TI.class); ti.test(1,"22"); } }
hadoop RPC就是类似情况,将网路通信内容封装在invoke中,客户端调用的时候无感知网络通信,就如本地调用函数一样。