黑马程序员技术交流社区

标题: 动态代理的疑问 [打印本页]

作者: 根号5    时间: 2012-4-27 18:54
标题: 动态代理的疑问
本帖最后由 根号5 于 2012-4-27 18:55 编辑

Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(),//类加载器怎么确定的,为什么不是用的target所属类的所实现的接口的class对象的类加载器    求解答!!!
                                new InvocationHandler()
                                {
                                        @Override
                                        public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable
                                        {
                                                advice.beforeMethod(method);
                                                Object retVal = method.invoke(target,args);
                                                advice.afterMethod(method);
                                                return retVal;
                                        }
                                }
                                );
作者: 根号5    时间: 2012-4-29 11:37
我这个问题怎么没人回答啊,求答案
作者: 邓斌    时间: 2012-4-29 11:46
Proxy.newProxyInstance  这个方法,接受3个参数,//指定类加载器//指定接口,//指定创建这个类的参数InvocationHandler接口
target.getClass().getClassLoader()  获取字节码,获取类加载器
target.getClass().getInterfaces(),  获取字节码,获取类的接口
new InvocationHandler()           指定创建这个类的参数InvocationHandler接口 ,因为是个接口,所以创建个匿名内部类来实现它,代理中的方法也就写在这个接口中。


作者: 罗旭维    时间: 2012-4-29 13:11
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。
我们自己的类一般都由系统类加载器加载,所以无论是通过加载目标类的加载器还是使用线程上下文加载器还是其他途径获得的加载器一般都是系统类加载器。
所以不要纠结该用哪种方式获得类加载器,或者纠结该用那个加载器了,其实可以理解为最终都是系统类加载器,一句ClassLoader.getSystemClassLoader()就ok了。




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