根据通用的设计原则:接口定义类型、类定义实现,代理对象可以实现一个或多个接口,但是不能实现类。因为代理类没有可以访问的名称,它们不能有构造函数,所以它们必须由工厂创建。具体参看:http://www.ibm.com/developerworks/cn/java/j-jtp08305.html

解决方案 »

  1.   

    机制不同
    cglib 可以代理所有类
      

  2.   

    代理对象可以实现一个或多个接口,但是不能实现类。
    因为代理类没有可以访问的名称,它们不能有构造函数。
          -------我觉的代理类不一定要实现接口啊,我可以完全用反射来代替啊.机制不同,cglib 可以代理所有类
       -------我知道cglib 可以代理所有类,我想讨论的是动态代理为什么不能代理类?
      

  3.   

    我是这样理解的:动态代理要代理被代理对象的所有方法,如果对象是类,则要将它的所有父类的方法代理,比如Object,还有的类存在final 方法,这样动态代理就失败了。
      

  4.   

    我是这样理解的:动态代理要代理被代理对象的所有方法,如果对象是类,则要将它的所有父类的方法代理,比如Object,还有的类存在final 方法,这样动态代理就失败了。     ------考虑到父类的方法,这是个问题,但我想这是可以解决的一个问题,ruby就可以在程序中指定哪几个方法被代理的。
      

  5.   

    csdn就没有能回答这个问题的人吗?顶下
      

  6.   

    sun以后会不会为java增加基于类的动态代理功能呢?
      

  7.   

    查了N多资料发现jdk动态代理和cglib一样底层都是用了字节码生成技术.下面是一个反编译后的动态代理类
      public final class TempProxy extends Proxy     implements Temp{       private static Method m4;     private static Method m2;     private static Method m0;     private static Method m3;     private static Method m1;       public TempProxy(InvocationHandler invocationhandler)   {         super(invocationhandler);     }       public final void Run()    {         try {             h.invoke(this, m4, null);             return;         }         catch(Error _ex) { }         catch(Throwable throwable)  {             throw new UndeclaredThrowableException(throwable);         }     }       public final String toString(){         try{             return (String)h.invoke(this, m2, null);         }         catch(Error _ex) { }         catch(Throwable throwable)  {             throw new UndeclaredThrowableException(throwable);         }         return "";     }       public final int hashCode() {         try {             return ((Integer)h.invoke(this, m0, null)).intValue();         }         catch(Error _ex) { }         catch(Throwable throwable){             throw new UndeclaredThrowableException(throwable);         }         return 123;     }       public final void Talk(){         try{             h.invoke(this, m3, null);             return;         }         catch(Error _ex) { }         catch(Throwable throwable) {             throw new UndeclaredThrowableException(throwable);         }     }       public final boolean equals(Object obj) {         try  {             return ((Boolean)h.invoke(this, m1, new Object[] {                 obj             })).booleanValue();         }         catch(Error _ex) { }         catch(Throwable throwable) {             throw new UndeclaredThrowableException(throwable);         }         return false;     }       static{         try{      m4 = Class.forName("Temp").getMethod("Run", new Class[0]);      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);      m3 = Class.forName("Temp").getMethod("Talk", new Class[0]);      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {                 Class.forName("java.lang.Object")             });         }         catch(NoSuchMethodException nosuchmethodexception) {             throw new NoSuchMethodError(nosuchmethodexception.getMessage());         }         catch(ClassNotFoundException classnotfoundexception) {             throw new NoClassDefFoundError(classnotfoundexception.getMessage());         }     } } 
      

  8.   

    最近也正在研究,我也没搞明白,jdk这样设计的原理。
    但是jdk动态代理可以代理final类,而cglib不能代理final类。
    至于性能方面,正在研究中。