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
|
|