动态代理(invoke(Object proxy,Method method,Object[] args)),求解释参数proxy及其使用方法求解释参数pro
动态代理(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 "改变返回的值"; }