Java中Method类和invoke方法的详细信息
在说Method和invoke的使用之前先来看一个小例子。 知道了那个就ok了
公共类方法invoke {
类动画{
公共语音打印(
system.out.println (' animal.print ) ) );
}
}
class Cat extends Animal {
@Override
公共语音打印(
system.out.println('cat.print ) );
}
}
publicstaticvoidmain (字符串[ ] args ) throws Exception { )。
methodanimalmethod=animal.class.getdeclaredmethod (' print ';
methodcatmethod=cat.class.getdeclaredmethod (' print ';
Animal animal=new Animal (;
Cat cat=new Cat (;
animalmethod.invoke(cat; //cat相当于调用父类的print方法
animalmethod.invoke(animal; animal.print (相当于;
catmethod.invoke(cat; 相当于cat.print (;
catmethod.invoke(animal;
}
}
执行结果如下
Cat.print (
Animal.print (
Cat.print (
exceptioninthread ' main ' Java.lang.illegalargumentexception : objectisnotaninstanceofdeclaringclass
at sun.reflect.nativemethodaccessorimpl.invoke0(native method ) )
at sun.reflect.nativemethodaccessorimpl.invoke (unknown source ) )。
at sun.reflect.delegatingmethodaccessorimpl.invoke (unknown source ) )。
在代码中,Cat类覆盖父类的animal print ()方法,通过反射分别为print () )检索Method对象。 最后,分别使用Cat和Animal实例对象执行print ()方法。 其中,animalMethod.invoke(animal )和cat method.invoke (cat ) cat )的示例对象的真实类型与method的声明Classs相同,并按预期打印。 在Animalmethod.invoke(Cat )中,cat是animal的子类,因此根据多态性的特性,子类调用父类的方法,并在方法执行时动态链接到子类的实现方法。 因此,这里调用Cat.print (方法; 在Catmethod.invoke(Animal )中,传递的参数类型animal是父类,但这次会抛出异常,因为它希望调用子类cat的方法。