当前位置: 代码迷 >> J2SE >> java Method.invoke方法使用困惑
  详细解决方案

java Method.invoke方法使用困惑

热度:20   发布时间:2016-04-23 20:01:02.0
java Method.invoke方法使用疑惑

Class clazz = Class.forName("com.csust.shopcar.entity.Departement");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("setDeptno", Integer.class);
method.invoke(obj, 1);

说明:Department类中设置了两个属性,deptNo,deptName还有get set方法。
我想问一下,method.invoke方法里面不是obj的引用吗,那为什么invoke还会成功找到Department的setDeptno方法执行。
当我这样定义时,Object obj = new Department();执行obj.setDeptno()就不行,invoke方法到底是什么执行的,求解释…………
------解决思路----------------------
method.invoke(obj, 1);执行这句话的时候传入了obj,虽然obj的句柄的确是Object型,但是由于前面有Class clazz = Class.forName("com.csust.shopcar.entity.Departement");
Object obj = clazz.newInstance();这段代码,所以这个时候调用obj.class()其实会返回“com.csust.shopcar.entity.Departement”。也就是说虽然他现在是Object型,但是他自己知道其实他是“Departement”类型,  所以在调用method.invoke(obj, 1);的时候,会首先将obj降至转化位Departement再调用。模拟其执行的代码应该是:
Object obj = new Department();
(Department)obj.setDeptno();
------解决思路----------------------
你前面obj.setDeptno(int)不可以,其实是编译器不允许。它忠实地往obj的声明类型java.lang.Object而不是实际类型com.csust.shopcar.entity.Departement里面去找setDeptno(int)方法,找不到,所以编译不通过。

而后面invoke之所以可以,是因为这个时候已经是运行期。运行环境自动到obj的真实类型com.csust.shopcar.entity.Departement里面去找相关的方法clazz.getMethod(...),如果找不到,找它的父类,再找不到,再向上...

区别就是编译期,只看声明的类型,而运行期看实际的类型
  相关解决方案