Java代理

  • 介绍
Java中的代理在某些场合下显得非常有用,可以让Java不再被束缚到一个class类文件中,比如:一个Java进程想调用另一个Java进程中的类(class)貌似是不可能的事情。是Java的代理让这变成了可能,究其原理其实也很简单——一个Java类的最本质就是一个字节码文件,只要是能在本地的JVM中制造出一个相同的字节码文件不就可以调用了吗? 代理和反射是息息相关的,所以有关代理最重要的一个类就是java.lang.reflect.Proxy。 java.lang.reflect.InvocationHandler Proxy.newProxyInstance(classLoader, interfacesList, proxyHandler)这个方法会返回生成的代理对象。 classLoader是定义了Proxy类的类加载器 interfacesList是代理类需要实现的接口列表,也就是被代理对象实现的接口 proxyHandler是接口InvocationHandler的实现类的实例对象
  • 示例
[codesyntax lang="java" lines="normal"]
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author suren
 * @date 2015-3-31
 *
 *       http://surenpi.com
 */
public class Test
{
	public static void main(String[] args)
	{
		HelloBoy helloBoy = new HelloBoy(); //这个可以想象成Spring在实例化bean的过程
		ProxyHelloBoy proxyHelloBoy = new ProxyHelloBoy(helloBoy);

		//下面的这个过程可以想象成Spring在做依赖注入的过程
		Hello hello = (Hello) Proxy.newProxyInstance(helloBoy.getClass().getClassLoader(),
				helloBoy.getClass().getInterfaces(), proxyHelloBoy);

		hello.say();
	}
}

interface Hello
{
	void say();
}

class HelloBoy implements Hello
{
	public void say()
	{
		System.out.println("boy say hello to you.");
	}
}

class ProxyHelloBoy implements InvocationHandler
{
	private Object target;

	public ProxyHelloBoy(Object target)
	{
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		System.out.println("prepare to visit http://surenpi.com");
		Object result =method.invoke(target, args);
		System.out.println("done visit http://surenpi.com");

		return result;
	}

}
[/codesyntax] 这里讲到的代理,只是同一工程或者模块级别的代理,这里还有一种更酷的代理—— JVM代理。
  • 参考
http://xiaoniudu2008.iteye.com/blog/236050 http://blog.csdn.net/rokii/article/details/4046098

你可能感兴趣的:(java代理)