Java反射机制中class属性的问题

yilinhust 2007-10-10 11:08:21
当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。因为使用了public修饰,所以我们可以采用如下的形式对其访问:

  
java.lang.Class c1 = String.class;


既然如此,为什么下面的调用方式就不行了呢?

  
java.lang.Class c1 = new String("x").class;


...全文
926 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
axx198903092008 2008-11-14
  • 打赏
  • 举报
回复
哇 张见识了!!!
lsflsflsf520520 2008-08-26
  • 打赏
  • 举报
回复
带着同样的问题看了以上回复后,我查阅了一下API文档,同时也进行了很多的测试而得出了以下结论,仅供参考
[class_name].class所返回的是一个Class类的对象,这个对象是用来描述[class_name]这个类的一些性质的
当你在eclipse中写上"[class_name].class."之后,出现的帮助信息中全是Class类中的方法
一句话: .class所返回的是一个描述基础类的性质的实例,对象并不代表某个具体的类,所以不能用obj.class,即
new String("*").class是不合法的
yilinhust 2007-10-20
  • 打赏
  • 举报
回复
回guaxixi627

首先谢谢你的回复,不过我不认同你的看法的
"一个实例化了的东西是不能直接用 .class来得到他的Class对象的",我问的是为什么,而不是结论本身
即"当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。"这句话,是否正确,错了的话又错在哪里?
要知道,java在运行时,只与.class文件相关的,而与.java文件无关

我的问题没有解决,按道理是可以作为 无满意结贴 的,但我还是结贴给了分,并感谢各位的回复!

10天内结贴,好像不晚吧?
guaxixi627 2007-10-19
  • 打赏
  • 举报
回复
最恨这种发贴不结贴的人啦
fool_leave 2007-10-11
  • 打赏
  • 举报
回复
Object.class
这个class不是变量
是java的特殊用法。
guaxixi627 2007-10-11
  • 打赏
  • 举报
回复
String 和new String("x")根本就是两不不同的东西,一个是类,一个是类实例化後的对象,
你new的时候是实例化了这个类,一个实例化了的东西是不能直接用 .class来得到他的Class对象的,
为什么不能?你就应该明白你返回的Class的实例实际上表示的是当前运行的Java应用程序中的类或者接口。
理所当然,String.class就可以得到当前的String类,因为String是一个类,
所以说我们要得到一个实例化後的对象的类,就必须这样 new String("x").getClass(),只有这样我们才能
得到这个String类,你可利用另外一个方法test System.out.println("test result is: "+new String("x").getClass.getName());可以看下打印的是什么结果。

yilinhust 2007-10-10
  • 打赏
  • 举报
回复
我说的是字节码,楼上的没有深入到本质阿
ChDw 2007-10-10
  • 打赏
  • 举报
回复
String.class这个是特殊用法,class并不是String的一个属性
guaxixi627 2007-10-10
  • 打赏
  • 举报
回复
java.lang.Class c1 = new String("x").class;
你new 的时候还没编译成.class文件,只有编译好了的才能用 这样用。
你可以这样 java.lang.Class c1 = new String("x").getClass();效果一样哈
yilinhust 2007-10-10
  • 打赏
  • 举报
回复
回 ChDw ,您说的这些,我还是了解的

不过对于这句话,是否赞成呢?

当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。

我也是在网上看到这句话的,也不知是否正确
forestking_xx 2007-10-10
  • 打赏
  • 举报
回复
瓦,长见识了
ChDw 2007-10-10
  • 打赏
  • 举报
回复
至于new String("x").class;这个为什么不行,
那是因为Java规定了只有Class.class才合法,
obj.class不合法。因为obj所属的类并不能在编译时确定,所以需要使用obj.getClass();
ChDw 2007-10-10
  • 打赏
  • 举报
回复
我已经说了String.class是特殊用法,class并不是String中的一个属性,与MyClass.myField在指令中已经是不同的


String.class在Class文件中指令是ldc_w #x 表示从常量池中获取出值并压栈,也就是获取出Class对象

MyClass.myField指令是 getstatic #x; 表示获取一个类的静态属性



所以两者是根本不同的

62,623

社区成员

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

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