当前位置: 代码迷 >> J2SE >> getMethod方法调用疑惑解决思路
  详细解决方案

getMethod方法调用疑惑解决思路

热度:121   发布时间:2016-04-24 02:15:32.0
getMethod方法调用疑惑
Employee是一个类,getName和raiseSalary是该类中的方法,现在通过Class类的getMethod方法获得获得这两个方法的方法指针,调用如下
Java code
Method m1=Employee.class.getMethod("getName");Method m2=Employee.class.getMethod("raiseSalary",double.class);

请问Employee.class.getMethod的class表示什么,去掉class可以么?

------解决方案--------------------
表示管理Employee这个对象的类Class的对象(有点绕口,注意Class和class的区别)。
------解决方案--------------------
因为方法可以被重载,所以需要通过参数类型来判断
------解决方案--------------------
探讨
引用:

表示管理Employee这个对象的类Class的对象(有点绕口,注意Class和class的区别)。

确实绕口,还没理解……

------解决方案--------------------
CSDN前辈的解释

打个比方,比如说,人是一个类(Human Class),张三,李四是具体的人的对象(Human instance),即 Human 张三 = new Human("张三"),Human 李四 = new Human("李四"),这时我把张三挑出来,我要判断张三是什么类,比如调用 张三.getClass(),那么,getClass返回值应该是一个特殊的类的对象,而不是人的对象,对不对?也就是Class c = 张三.getClass(),而不是 Human c = 张三.getClass(), 因为张三,李四这样的才算是人的对象。那么这个特殊的类的对象c就是你所说的类对象。同样的,Class.forname( "Human"),返回的就应该是人的类的对象而不是人的对象。

再打个比方,比如你有一个配置文件,就用porperties文件吧,里面有这样的设置
classname=Human (根据不同的需求可以设置需要用不同的类)
这时候,你想从配置文件中读出类的名字,然后想通过这个名字去生成实例,而读出文件时,得到的是"Human"这样的字符串,你要怎么用它生成实例呢,总不能 "Human" 张三 = new "Human"("张三")吧,字符串是不能当作类使用的,对不对?你也不可能在配置文件中设置一个类,然后从文件中读出来就是一个类,你只能在文件中设置classname=Human这样的字符串(文件里的内容都算是字符串),你从文件里读出来的也只能是字符串,对不对?那么这时候,你要生成实例,就必须通过这个特殊的类对象,即 Class c = Class.forName("Human");这样你得到这个类对象c以后,就可以通过相应的方法去创建人对象或者改变某个人对象的属性和方法。这个类对象到底有什么用?这里就是主要的用处了。
------解决方案--------------------
简单的说 代表内存中的一份字节码 
其他参看楼上
------解决方案--------------------
我不太懂,但是我可以这么说一下儿,Employee这个类没有getMethod方法,所以去掉class一定不行
------解决方案--------------------
探讨
与该Employee类对象的Class对象

------解决方案--------------------
显然不可以,因为getMethod不是Employee这个类定义的,而是Class类定义的

探讨
Employee是一个类,getName和raiseSalary是该类中的方法,现在通过Class类的getMethod方法获得获得这两个方法的方法指针,调用如下
Java code
Method m1=Employee.class.getMethod("getName");
Method m2=Employee.class.getMethod("raiseSalary",double.cla……

------解决方案--------------------
Class c = Employee.class; 
Method m1=c.getMethod("getName");
Method m2=c.getMethod("raiseSalary",double.class);