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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏晓彤 中级黑马   /  2013-3-3 14:19  /  2094 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这部分视频看了2遍了,很模糊,今天起来觉得忘记的差不多了,可能是之前看的不仔细吧,导致这部分视频概念都很模糊,现在有看了一遍
发现之前都没彻底理解下面断代码,从开始就没理解,是我这部分知识点没学好的主要原因吧
Class clazzProxy1=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
我现在理解为clazzProxy1是代理类Proxy实现了Collection接口的Class对象对吗?

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

8 个回复

倒序浏览
clazzProxy1是代理类Proxy实现了Collection.class的类加载器
回复 使用道具 举报
崔芝鲁 发表于 2013-3-3 14:42
clazzProxy1是代理类Proxy实现了Collection.class的类加载器

不对吧 clazzProxy1.getName()返回值是$Proxy0,$Proxy0是类加载器?
回复 使用道具 举报
Class是这个代理类的字节码,可以通过这份字节码创建这个代理类的对象,而这个代理类是实现了Collection接口的、Collection接口的子类,
创建出来的代理类对象,实际上是Collection接口的子类对象,所以这个对象具有Collection接口的所有方法
回复 使用道具 举报
对的!
创建代理对象其实有两种方法:
一、
Class clazzProxy1=Proxy.getProxyClass(Collection.class.getClassLoader(),new Class[]{Collection.class}); //获取动态代理类的Class对象
Constructor constructor = clazzProxy1.getConstructor(new Class[]{InvocationHandler.class});//获取clazzProxy1类带一个InvocationHandler参数的对象
Collection proxy =(Collection) constructor .newInstance(new Object[]{InvacationHandler类型的参数});
这是通过反射的方式
二、
Collection proxy =(Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),new Class[]{ Collection.class},InvacationHandler类型的参数);
对上边的简化

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
貌似大家都比我学得好呢,弱弱的表示不服!
回复 使用道具 举报
clazzProxy1是动态代理类的字节码,它继承目标类的接口,并且指定其被加载时的类加载器,这个类加载器一般也就是目标类的加载器
回复 使用道具 举报
本帖最后由 谢洋 于 2013-3-5 02:37 编辑

一、先明确两点:
1、所有代理类都是Poxy的子类;
2、代理类只能实现目标类的接口功能,并没拥有目标类所有功能,原因是java不支技多继承,它已继承了Proxy,不能再继承别的了
二、jvm生成的动态类必须实现一个或多个接口,为什么呢?
  newProxyInstance(ClassLoader loader,Class<?>[] interfaces,invocationHandler h)
  1、首先,要生成一个类,那么得想办法拿到一些构造函数;JVM正是通过这些接口得到这些接口的构造函数,然后通过这些构造函数生成一个新的类,
  这就是传说中的代理类了;(这点我们可以去看原代码)
  2、问题又来,即然这类是接口生成的,那它的方法体是怎么来的,怎么被调用?
   a、当JVM通过代理类生成实例时,他会把这个实例关联的一个调用处理程序,
   关键来了!!
   b、当实例在调用方法时,他会自动调用关联到他的InocationHandler 对象的(调用处理程序)invoke方法,
     同时他还会把对象(自己,proxy)和代表正在调用的方法的Method的 对象(method)以及方法的参数(args)传给invoke方法;
     注意:Method是什么,我想大家都很清楚吧,Method都有了,不就是搞到方法了?
     至于这个method怎么来的,我猜是实例通过反射,叫classloader搞来,因只有classloader才知道它把字节码加载到哪了,
     这样子跟上面的参数就匹配了
   c、因为invoke是我们复写的,还是看代码吧
       public Object invoke(Object proxy,Method method,Object[] args)
       throws Throwable {
         //插入广告
         advice.beforeMethod(method);
         //获取目标方法的返回值
         Object retVal = method.invoke(proxy,args);
         advice.afterMethod(method);
         //返回目标方法的返回值
         return retVal;
     }
     /**这是张老描术代理类方法的内部
      * 这个方法是代理类执行其某个方法时自动调用的,
      * 相当于下面代码
      * xxxMethod(args){
      *   return invoke(this,this.getClass.getMethod("xxxMethod"),args);
      * }
      */

  

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马