黑马程序员技术交流社区

标题: Java代理 [打印本页]

作者: 百里青山    时间: 2016-4-10 11:44
标题: 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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2