我有真实的对象和动态代理处理程序类,对于动态代理处理程序,我将所有返回的字符串值替换为其他一些值并在实现的方法中返回它们,但是,返回原始返回的值,我只能修改调用参数,而不是返回值。
package reflection;
public class RealObject implements Interface {
@Override
public void doSomething() {
System.out.println("Do Something");
}
@Override
public String returnSomethingElse(String arg) {
System.out.println("Do something else "+arg
);
return arg;
}
}
这是测试和处理程序:
package reflection;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SimpleProxyDemo
{
public static void process(Interface iface)
{
iface.doSomething();
iface.returnSomethingElse("argsHere");
}
public static void main(String[] args) {
process(new RealObject());
//process(new SimpleProxy(new RealObject()));
//Interface dynamicProxy=(Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),new Class[]{Interface.class},new SimpleProxyDemo().new DynamicProxyHandler(new RealObject()));
Interface dynamicProxy=(Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),new Class[]{Interface.class},new DynamicProxyHandler(new RealObject()));
process(dynamicProxy);
}
static class DynamicProxyHandler implements InvocationHandler{
private Object proxied;
public DynamicProxyHandler(Object proxied)
{
this.proxied=proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("THIS IS BEFORE CALL FROM DYNAMIC PROXY, CALLING METHOD "+method.getName());
if (args!=null&&args.length>0) {
args[0] = args[0] + "I DO INFLUENCE";
}
//Object toBeReturned= method.invoke(proxied,args+"I DO INFLUENCE");
Object toBeReturned= method.invoke(proxied,args);
System.out.println("THIS IS AFTER CALL FROM DYNAMIC PROXY, CALLING METHOD "+method.getName());
//if (toBeReturned instanceof String) {
if (toBeReturned !=null) {
return "OLOLO I CAN INFLUENCE";
}
else
return toBeReturned;
}
}
}
我的期望是,对于返回字符串的方法,返回值将被我的字符串“OLOLO I CAN INFLUENCE”替换,但代理对象不会在其方法中返回它。
这是输出:
Do Something
Do something else argsHere
THIS IS BEFORE CALL FROM DYNAMIC PROXY, CALLING METHOD doSomething
Do Something
THIS IS AFTER CALL FROM DYNAMIC PROXY, CALLING METHOD doSomething
THIS IS BEFORE CALL FROM DYNAMIC PROXY, CALLING METHOD returnSomethingElse
Do something else argsHereI DO INFLUENCE
THIS IS AFTER CALL FROM DYNAMIC PROXY, CALLING METHOD returnSomethingElse
所以它看起来像 Object toBeReturned= method.invoke(proxied,args); 并且在调用方法结束时返回它对代理返回的内容绝对没有影响?难以置信,我的错误在哪里?