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就不对了
下面是代理类的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",都没有问题。
这句话是以proxyObj,也即是你的代理对象作为主调,来执行method()方法,自然是返回method()的返回值了。
Object object = method.invoke(proxyObj, args);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。