A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 百里青山 高级黑马   /  2016-4-10 11:44  /  572 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • 介绍
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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马