JAVA反射机制的疑问,望高手解惑

lzfwan 2011-07-28 01:19:42
第一问:
在利用反射调用对象方法的时候有没有生成这个类的对象。
例: Class cUser = User.class;
Method m1 = cUser .getDeclaredMethod("test");
m1.invoke(foo);

第二问:
在如下代码中,两种方式对于执行效率来说是一样的么?
1. Class cUser = User.class;
2. User user = new User();
Class cUser = user.getClass();
-----上面两种获得CLASS的方式不一样,下面继续------------------
Method m1 = cUser .getDeclaredMethod("test");
m1.invoke(foo);


...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzfwan 2011-07-28
  • 打赏
  • 举报
回复
彻底理解错了。。
得到CLASS的方式跟我后面的疑问根本就没有关系。
因为在调用Method对象的invoke(?)方法时,是要传对象实例进去的。

因为CLASS本身相当于模板,只是一个定义,通过这个定义可以找到调用的方式。
而对象是按模板(指CLASS)定义开辟的内存空间,所以在invoke方法调用时还是要给出对象的引用(内存地址)才能完成操作

没细看调用方式就在这发问,惭愧啊~~~
lzfwan 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 java_pengjin 的回复:]

相对于new来说,反射的效率低很多
[/Quote]

嗯,低是肯定的。但是有些时候牺牲一些效率也还是必要的。就目前那么多的JAVA框架来说,都得用到反射技术,要不然很多功能实现不了。
lzfwan 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 daijope 的回复:]

对象我想是有的,只是这样在执行的时候才生成的,这里不存在该对象的引用,我们不能通过该对象的引用来操作该对象的方法。一切都是动态的吧,
获取class有三种方法,还有一种如class.forName("java.io.FileInputStream");
[/Quote]

生成方法是其次,我主要关心的是通过类直接得到CLASS和通过对象得到CLASS来进行反射操作的效率是不是一样。换种说法就是:第一种方式应该是每次都开辟新的内存,第二种方式会不会每次都用 new User()时产生的内存而不是每次也开辟新内存
当然,new User()后的对象我是存起来了,并不会像例子中表现的那样每次反射前都新NEW
jamespengo 2011-07-28
  • 打赏
  • 举报
回复
相对于new来说,反射的效率低很多
daijope 2011-07-28
  • 打赏
  • 举报
回复
对象我想是有的,只是这样在执行的时候才生成的,这里不存在该对象的引用,我们不能通过该对象的引用来操作该对象的方法。一切都是动态的吧,
获取class有三种方法,还有一种如class.forName("java.io.FileInputStream");

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧