关于.class字段的思考

时间:2012-06-04 08:16:18

标签: java reflection

阅读课程加载http://onjava.com/pub/a/onjava/2005/01/26/classloading.html,遇到了 - “......每当我们编译任何Java文件时,编译器都会在发出的字节代码中嵌入一个名为class的公共静态最终字段java.lang.Class。由于这个字段是公共的,我们可以使用点分表示法访问它,如下所示:

java.lang.Class klass = Myclass.class; ............“

我尝试使用反射访问此字段(Myclass.class),这很简单但我仍然同意但仍然:)我得到java.lang.NoSuchFieldException:class

Myclass myObject = new Myclass; 
System.out.println(myObject.getclass().getField("class"));

那么运行时而不是编译器添加静态.class字段吗?即便如此,为什么使用反射无法访问它?

2 个答案:

答案 0 :(得分:1)

这本身不是字段访问,而是Java语言语法的expression,只是看起来像字段访问。我认为编译器可以将这样的合成字段放入类文件中,但我不知道有哪一个。

答案 1 :(得分:0)

通常,Java语言规范表明此表单的表达式必须返回相应的类对象,但它没有定义如何完成此操作。 Eclipse JDT编译器实际上并没有使它成为一个字段。它创建了一个名为“$ class”的方法,只要你访问类似myClass.class的东西就会调用它。