CGLib方法拦截或JDK方法调用中的return对象是什么意思?
What is the meaning of the return Object in CGLib method intercept or JDK method invoke?
在CGLib代理的方法拦截中:
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
Performance performance = new Performance();
performance.begin(arg0.getClass().getName() + "." + arg1.getName());
Object result = arg3.invokeSuper(arg0, arg2);//or just arg3.invokeSuper(arg0, arg2); and return null
performance.end();
return result;
}
并且在 JDK 代理的方法调用中
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Performance performance = new Performance();
performance.begin(target.getClass().getName() + ":" + method.getName());
Object obj = method.invoke(target, args);//or just method.invoke(target, args); and return null
performance.end();
return obj;
}
但是当我 return 为 null 时,什么都没有 changed.So 为什么这些方法需要一个 return 值?
如果您 return null
来自这些拦截器方法,那么您对代理 class 的方法调用的 return 值将始终为空,即使实际方法return编辑非空值。
返回 null 对你有用,因为你可能只有 returns void
的方法,但是一旦你的方法中有任何 return 值,你的代码就会中断.
你正在拦截一个调用方法,如果你改变结果,逻辑行为也会改变。
重要提示:如果原始方法 returns 是原始类型,您将从 JDK 代理获得漂亮的 NullPointerExpection
。
在CGLib代理的方法拦截中:
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
Performance performance = new Performance();
performance.begin(arg0.getClass().getName() + "." + arg1.getName());
Object result = arg3.invokeSuper(arg0, arg2);//or just arg3.invokeSuper(arg0, arg2); and return null
performance.end();
return result;
}
并且在 JDK 代理的方法调用中
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Performance performance = new Performance();
performance.begin(target.getClass().getName() + ":" + method.getName());
Object obj = method.invoke(target, args);//or just method.invoke(target, args); and return null
performance.end();
return obj;
}
但是当我 return 为 null 时,什么都没有 changed.So 为什么这些方法需要一个 return 值?
如果您 return null
来自这些拦截器方法,那么您对代理 class 的方法调用的 return 值将始终为空,即使实际方法return编辑非空值。
返回 null 对你有用,因为你可能只有 returns void
的方法,但是一旦你的方法中有任何 return 值,你的代码就会中断.
你正在拦截一个调用方法,如果你改变结果,逻辑行为也会改变。
重要提示:如果原始方法 returns 是原始类型,您将从 JDK 代理获得漂亮的 NullPointerExpection
。