1

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

java.lang.Class 类 = Myclass.class; …………”

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

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

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

4

2 回答 2

1

这本身不是字段访问,而是 Java 语言语法的一种表达方式,看起来就像是字段访问。我想编译器可以将这样的合成字段放入类文件中,尽管我不知道有一个这样做的。

于 2012-06-04T08:22:15.270 回答
0

一般来说,Java 语言规范说这种形式的表达式必须返回相应的类对象,但它没有定义必须如何完成。Eclipse JDT 编译器实际上并没有把它变成一个字段。它创建了一个名为“$class”的方法,每当您访问 myClass.class 之类的内容时都会调用该方法。

于 2012-06-11T12:22:28.863 回答