开发者社区> 问答> 正文

java动态代理的基础问题

public class VectorProxy implements InvocationHandler {
    private Object proxyObj;
    public VectorProxy(Object obj) {
        proxyObj = obj;
    }
    public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        System.out.println("Before calling : " + method);
        if (args != null) {
            for (Object o : args) {
                System.out.println(o);
            }
        }
        Object object = method.invoke(proxyObj, args);
        System.out.println("After calling : " + method);
        return object;
    }
    public static Object factory(Object obj) {
        Class<?> classType = obj.getClass();
        return Proxy.newProxyInstance(classType.getClassLoader(), obj.getClass().getInterfaces(), new VectorProxy(obj));
    }
    public static void main(String[] args) {
        List list = (List) factory(new Vector());

        list.add("hello");
    }
}

public Object invoke 这个方法的返回值能决定什么?为什么改成null就不对了

展开
收起
蛮大人123 2016-06-07 16:54:16 1838 0
2 条回答
写回答
取消 提交回答
  • 下面是代理类的class中的add(object):

    public final boolean add(Object paramObject)
        throws 
      {
        try
        {
          return ((Boolean)this.h.invoke(this, m3, new Object[] { paramObject })).booleanValue();
        }
        catch (Error|RuntimeException localError)
        {
          throw localError;
        }
        catch (Throwable localThrowable)
        {
          throw new UndeclaredThrowableException(localThrowable);
        }
      }
    
    "  return ((Boolean)this.h.invoke(this, m3, new Object[] { paramObject })).booleanValue();
    就是调用VectorProxy.invoke方法,前面有一个强转换,所以你返回null就会有问题,返回string,就是java.lang.String cannot be cast to java.lang.Boolean"

    下面我们看看add(index, element)这个方法

      public final void add(int paramInt, Object paramObject)
        throws 
      {
        try
        {
          this.h.invoke(this, m4, new Object[] { Integer.valueOf(paramInt), paramObject });
          return;
        }
        catch (Error|RuntimeException localError)
        {
          throw localError;
        }
        catch (Throwable localThrowable)
        {
          throw new UndeclaredThrowableException(localThrowable);
        }
      }
    这个方法没有返回值,所以你return null或者return "xxx",都没有问题。
    2019-07-17 19:30:29
    赞同 1 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    这句话是以proxyObj,也即是你的代理对象作为主调,来执行method()方法,自然是返回method()的返回值了。
    Object object = method.invoke(proxyObj, args);

    2019-07-17 19:30:29
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载