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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李月 中级黑马   /  2012-6-7 16:36  /  1217 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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)

难道代理是对接口而言的?

3 个回复

倒序浏览
本帖最后由 刘克方 于 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}

回复 使用道具 举报
  • 使用Proxy创建代理对象要传3个参数,一个是类加载器,一个是被代理对象的接口,一个是拦截器
  • 而且被代理对象必须实现了一个接口
    Student proxy1=(Student)Proxy.newProxyInstance(
  •                                 Student.class.getClassLoader(),
  •                                 new Class[]{Student.class},
    从你的代码可以看出Student 是接口,把你第二个参数 new Class[]{Student.class}换成被代理对象.class.getInterfaces();也就是target.getClass().getInterfaces();
回复 使用道具 举报
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方法得到调用,
然后真正的服务就执行了!(代理类可以理解为中介者)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马