解决方案 »

  1.   

    你用obj.setDeptno之所以不行,那是因为obj句柄被申明成Object类型了,而Object类型没有setDeptno方法,但是obj指向的对象实际上Department类型的。这其实就是多态啊。
      

  2.   

    因为
       Object obj = clazz.newInstance();
    实际上等于
       Department dep = (Department)clazz.newInstance();
      

  3.   

    invoke(Object,parameters)里面对是否为override做了不同的处理,也就是楼上说的,Object类中本身就没有setDeptno方法,你直接用Object类的对象去调用肯定不行,如果Object类中有setDeptno方法但没有实现,应该是可以的。
      

  4.   

    这个不行我知道,我想知道invoke为什么可以,它的具体实现是什么?
      

  5.   

    getMethod("setDeptno", Integer.class);
    你这里已经明确的说明setDeptno 是一个int的参数的方法
      

  6.   

    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();
      

  7.   

    你前面obj.setDeptno(int)不可以,其实是编译器不允许。它忠实地往obj的声明类型java.lang.Object而不是实际类型com.csust.shopcar.entity.Departement里面去找setDeptno(int)方法,找不到,所以编译不通过。而后面invoke之所以可以,是因为这个时候已经是运行期。运行环境自动到obj的真实类型com.csust.shopcar.entity.Departement里面去找相关的方法clazz.getMethod(...),如果找不到,找它的父类,再找不到,再向上...区别就是编译期,只看声明的类型,而运行期看实际的类型
      

  8.   


    原理的话,可以先看看,多态是如何实现的
    http://blog.csdn.net/biaobiaoqi/article/details/6894869
    http://www.cppblog.com/luyulaile/archive/2011/04/08/143762.html多态就是通过运行时对方法表的查找,来确定到底调用哪个方法。
    反射也有点类似,也是运行时动态查找方法,字段,类等信息,只不过,而且反射要查找的内容是只有运行了才知道的。
      

  9.   

    按楼主要问的:Object obj = new Department();执行obj.setDeptno()就不行,invoke方法到底是什么执行的1:Object obj = new Department();//这一个是在栈变量为obj,类型为Object,然后obj引用指向堆内存中的Department,父类引用指向子类,然后如果要调用obj.setDeptno(),然后在栈中的对象类型是Object,固Object中没有setDeptno这个方法,所以编译就会报错,需要调用的话就要把obj向下转型为Department对象,也就是修改栈中的obj类型。2:invoke方法,传入了obj引用,和明确了方法名,和参数类型。其底层通过obj引用找到堆中的Department对象,再通过Department调用方法区中的Department地址,通过你指定的方法名和参数类型,传入值。然后自动压栈调用执行。关于栈和堆,可参考(鼠标点击): http://blog.csdn.net/hubiao_0618/article/details/38409303  
    关于多态,可参考(鼠标点击): http://blog.csdn.net/hubiao_0618/article/details/38523281