当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。因为使用了public修饰,所以我们可以采用如下的形式对其访问: java.lang.Class c1 = String.class;既然如此,为什么下面的调用方式就不行了呢? java.lang.Class c1 = new String("x").class;
调试欢乐多
你new 的时候还没编译成.class文件,只有编译好了的才能用 这样用。
你可以这样 java.lang.Class c1 = new String("x").getClass();效果一样哈
String.class在Class文件中指令是ldc_w #x 表示从常量池中获取出值并压栈,也就是获取出Class对象MyClass.myField指令是 getstatic #x; 表示获取一个类的静态属性所以两者是根本不同的
那是因为Java规定了只有Class.class才合法,
obj.class不合法。因为obj所属的类并不能在编译时确定,所以需要使用obj.getClass();
这个class不是变量
是java的特殊用法。
你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());可以看下打印的是什么结果。
"一个实例化了的东西是不能直接用 .class来得到他的Class对象的",我问的是为什么,而不是结论本身
即"当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。"这句话,是否正确,错了的话又错在哪里?
要知道,java在运行时,只与.class文件相关的,而与.java文件无关我的问题没有解决,按道理是可以作为 无满意结贴 的,但我还是结贴给了分,并感谢各位的回复!10天内结贴,好像不晚吧?
[class_name].class所返回的是一个Class类的对象,这个对象是用来描述[class_name]这个类的一些性质的
当你在eclipse中写上"[class_name].class."之后,出现的帮助信息中全是Class类中的方法
一句话: .class所返回的是一个描述基础类的性质的实例,对象并不代表某个具体的类,所以不能用obj.class,即
new String("*").class是不合法的