黑马程序员技术交流社区

标题: 关于反射中的Method获取 [打印本页]

作者: 何竹冬    时间: 2013-1-4 20:49
标题: 关于反射中的Method获取
本帖最后由 何竹冬 于 2013-1-6 13:43 编辑

视频上老师在讲反射的时候下面这段代码时获取某个对象所属类中指定的方法
  1. import java.lang.reflect.*;
  2. public class InputReaderTest
  3. {
  4. public static void main(String[] args) throws Exception
  5. {
  6. String str1 = "abc";
  7. //获取String字节码对象调用getMethod方法
  8. Method methodCharAt = String.class.getMethod("charAt",int.class);
  9. System.out.println(methodCharAt.invoke(str1,1));

  10. }
复制代码
我想的是先获取调用方法的对象所属类的字节码对象,然后获取对象所属类的方法,这样写是不是更容易理解一些呢 ?
  1. import java.lang.reflect.*;
  2. public class InputReaderTest
  3. {
  4. public static void main(String[] args) throws Exception
  5. {
  6. String str1 = "abc";
  7. //获取str1字符串对象所属类String字节码对象调用getMethod方法
  8. Method methodCharAt=str1.getClass().getMethod("charAt",int.class);
  9. System.out.println(methodCharAt.invoke(str1,1));

  10. }
复制代码

作者: 舒远    时间: 2013-1-4 20:55
你得知道String.class和str1.getClass()所获取的对象是同一个:String类的字节码文件。
作者: 黄锦成    时间: 2013-1-4 20:57
这个没什么区别,字节码就只有一份,获取字节码有3种方法,你用的是其中而已,老师用的是另外一种
作者: 焦健    时间: 2013-1-4 22:24
Method methodCharAt = String.class.getMethod("charAt",int.class);
在应用中这样写,你首先要知道这个类的名字,通过 :类名.class的方法获得字节码
Method methodCharAt=str1.getClass().getMethod("charAt",int.class);
这样写需要先有这个类的对象,通过:对象.getClass()方法获得字节码。
这两中方式能够实现同样的功能,只是应用场合不同。


在实际应用中用到最多的是Class.forName("java.lang.String")的方式获得字节码,
因为在框架设计的时候,这个类还不存在,那么设计框架的时候,不知道类名,也没有对象,就只能通过Class.forName("java.lang.String")这种方式创建对象,这样获取字节码的方式只需要一个字符串,只要把这个字符串添加到配置文件中就可以,要知道我们编译完的class文件用户是不能改变的,但是用户可以改变配置文件,我们只要事先在程序中写入加载配置文件的功能就可以。

这一点张孝祥老师讲的非常好,多看看视频。。。
作者: 何竹冬    时间: 2013-1-4 22:57
焦健 发表于 2013-1-4 22:24
Method methodCharAt = String.class.getMethod("charAt",int.class);
在应用中这样写,你首先要知道这个类 ...

你好,我知道都可以,不知道你想说什么。。。
作者: 焦健    时间: 2013-1-4 23:03
何竹冬 发表于 2013-1-4 22:57
你好,我知道都可以,不知道你想说什么。。。





我想说的是,这三种方式分别应用于不同的场合,完毕!
作者: 何竹冬    时间: 2013-1-4 23:09
焦健 发表于 2013-1-4 23:03
我想说的是,这三种方式分别应用于不同的场合,完毕!

好吧,多谢了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2