当前位置: 代码迷 >> J2SE >> 动态署理(invoke(Object proxy,Method method,Object[] args)),求解释参数proxy及其使用方法
  详细解决方案

动态署理(invoke(Object proxy,Method method,Object[] args)),求解释参数proxy及其使用方法

热度:1871   发布时间:2013-02-25 00:00:00.0
动态代理(invoke(Object proxy,Method method,Object[] args)),求解释参数proxy及其使用方法

求解释参数proxy及其使用方法
Object o = method.invoke(obj, args);
这个返回值有什么用啊?怎么用啊?
有个小例子就最好不过了,小弟刚入行,谢谢各位大峡了。
------最佳解决方案--------------------------------------------------------
http://www.ticmy.com/?p=200第6点
------其他解决方案--------------------------------------------------------
引用:
求解释参数proxy及其使用方法
Object o = method.invoke(obj, args);
这个返回值有什么用啊?怎么用啊?
有个小例子就最好不过了,小弟刚入行,谢谢各位大峡了。


方法调用的反射执行模式

Object o = method.invoke(obj, args);

method是方法对象
obj是该方法对象所在的类对象实例
args是方法参数
返回是Object类型,因为编译时无法获得方法轻易获得所要调用方法的返回类型,因此使用了“万能型”

------其他解决方案--------------------------------------------------------
我主要是想知道这个返回值O有什么用处,还有那个参数proxy,在这个小程序里没有用到,他的用处又是什么呢?
------其他解决方案--------------------------------------------------------
引用:
我主要是想知道这个返回值O有什么用处,还有那个参数proxy,在这个小程序里没有用到,他的用处又是什么呢?

调用带返回值的方法不要它的返回吗?

对于这里重写了的invoke方法,这个Object proxy是没用到,仅仅是为了实现覆盖(要与祖先类中同名方法参数一致)。
------其他解决方案--------------------------------------------------------
An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method.

关于覆盖,就是要求方法签名(名称与参数)与返回类型保持一致。
------其他解决方案--------------------------------------------------------
这些我一点都看不懂丫
------其他解决方案--------------------------------------------------------
上面说的可能有歧义,修改一下:

关于覆盖,就是要求子类方法的签名(名称与参数),返回类型与祖先类的保持一致才能实现。 
------其他解决方案--------------------------------------------------------
你觉得没用是因为你就是为了用而用,那么当然没意义。

我可以知道任意方法的调用对象主体信息,方法信息,参数信息,我就可以根据各种情况作出相应处理

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (method.getName().matches("^(remove
------其他解决方案--------------------------------------------------------
persist
------其他解决方案--------------------------------------------------------
merge)\\w*$")){
System.out.println("检测到事务方法,开启事务");
}

if (proxy instanceof String){
System.out.println("这是个SQL字符串而不是个结果集 动态执行它");
}

Object o = method.invoke(Class.forName(getName()).newInstance(), args);//这里做你原来要做的事

System.out.println("得到原来的返回值:"+o);

if (method.getReturnType() == ResultSet.class ){
System.out.println("检测到查询方法,将结果装箱");
}

return "改变返回的值";
}
  相关解决方案