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中,客户端调用的时候无感知网络通信,就如本地调用函数一样。


发表评论