黑马程序员技术交流社区

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

作者: 李月    时间: 2012-6-7 16:36
标题: 动态代理的问题?
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.util.ArrayList;
  5. import java.util.Collection;

  6. public class c2 {

  7.         /**
  8.          * @param args
  9.          */
  10.         public static void main(String[] args) {
  11.                 // TODO Auto-generated method stub
  12.                 Student proxy1=(Student)Proxy.newProxyInstance(
  13.                                 Student.class.getClassLoader(),
  14.                                 new Class[]{Student.class},
  15.                                
  16.                                 new InvocationHandler() {
  17.                                        
  18.                                         @Override
  19.                                         public Object invoke(Object proxy, Method method, Object[] args)
  20.                                                         throws Throwable {
  21.                                                 // TODO Auto-generated method stub
  22.                                                 //Object obj=method.invoke(target, args);
  23.                                                 return null;
  24.                                         }
  25.                                 });
  26.                 proxy1.setAge(1);

  27.         }

  28. }
复制代码
错误信息显示:

Exception in thread "main" java.lang.IllegalArgumentException: Exercise.Student is not an interface
        at java.lang.reflect.Proxy.getProxyClass(Proxy.java:362)
        at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
        at Exercise.c2.main(c2.java:16)

难道代理是对接口而言的?
作者: 刘克方    时间: 2012-6-7 16:37
本帖最后由 刘克方 于 2012-6-7 16:44 编辑

new Class[]{Student.class}, 这儿的参数是一个接口类的字节码(Class),而Student类不是接口,所以student.class并非接口的字节码(Class);
所以会报Exception in thread "main" java.lang.IllegalArgumentException: Exercise.Student is not an interface错误的参数类型错误;
你可以定义一个Person接口,然后让Student类实现;最后把new Class[]{Student.class}改为new Class[]{Person.class}


作者: 胡宝林    时间: 2012-6-7 17:54

作者: 舒赫莱宁    时间: 2012-6-7 21:18
java.lang.reflect包下的Proxy是基于接口的代理,这些接口相当于提供给你的服务;
JDK中有详细的关于该方法参数的说明:

newProxyInstance
public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException
Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler. This method is equivalent to:
     Proxy.getProxyClass(loader, interfaces).

         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });

Proxy.newProxyInstance throws IllegalArgumentException for the same reasons that Proxy.getProxyClass does.

Parameters:
loader - the class loader to define the proxy class
interfaces - the list of interfaces for the proxy class to implement
h - the invocation handler to dispatch method invocations to

该方法会返回一个实例,这个实例带有已提供接口的的所有服务(可理解为接口中的方法)
一旦类中的方法得到调用,那么生成的代理类的invoke方法得到调用,
然后真正的服务就执行了!(代理类可以理解为中介者)




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