什么是MyClass.class?

以下是MainClass.java中列出的代码。

public class MainClass { public static void main(String[] args) { System.out.println("main started..."); Class c = MyClass.class ; //this class variable seems to be public static. //But, as it is clearly visible in the MyClass, //no reference variable is declared. //My problem is that from where this class variable //came from. //i also check out the Object.java file, but it also don't //have any public static class variable of Class class //like there is //out (instance of PrintStream class) in System class. //Hope all u mindoverflow guys help me to sort out //this probz. try { Class.forName( c.getName() ) ; System.out.println("classloader of MyClass : " + MyClass.class.getClassLoader()); System.out.println("classloader of MyClass : " + String.class.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("main ended..."); } } class MyClass{ static{ System.out.println("static block of MyClass class."); } } 

thnx coobird …我发现这篇文章很有用。 🙂

但是,关于文学,我的知识仅限于:

 int i = 5 ; //here 5 is an integer literal float f = 5.6f ; //here 5.6f is a float literal 

我知道唯一的非原始文化

 String str = "java" ; //"java" is a String litereal 

你和Jon Skeet非常清楚地告诉我这一点。

在java中找到更多的文字???


同意……所以根据讨论,总文字被归类为: –

  • 原始文字
  • 字符串文字
  • class级文字
  • 空值

是否有更多的文字(使列表更长一点🙂


当我使用decomipler反编译MainClass.class时,会发现两个Class类型的静态变量(可能是coz,我已经使用了2次类文字)被自动添加,但从未发现在代码中使用过。 此外,两个类文字都直接从我在java文件中使用它们的类文件中替换。

我的代码: –

 public class MainClass { public static void main(String[] args) { System.out.println("main started..."); Class c = MyClass.class ; try { Class.forName( c.getName() ) ; System.out.println("classloader of MyClass : " + MyClass.class.getClassLoader()); System.out.println("classloader of MyClass : " + String.class.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("main ended..."); } } 

反编译生成的代码: –

 import java.io.PrintStream; public class MainClass { public MainClass() { } public static void main(String args[]) { System.out.println("main started..."); Class c = MyClass; try { Class.forName(c.getName()); System.out.println((new StringBuilder("classloader of MyClass : ")).append(MyClass.getClassLoader()).toString()); System.out.println((new StringBuilder("classloader of MyClass : ")).append(java/lang/String.getClassLoader()).toString()); } catch(ClassNotFoundException e) { e.printStackTrace(); } System.out.println("main ended..."); } static Class class$0; static Class class$1; } 

它是“类文字” – 一种获取特定类型的Class的简单方法。

有关更多详细信息,请参阅Java语言规范的第15.8.2节 。

请注意,它不是该类的“字段”,它是一种特殊的语法糖。

由于类型擦除,您可能会遇到有关generics的有趣限制。 Guice中引入的TypeLiteral提供了更多信息和解决方法。

在实现方面,它取决于您要定位的字节码版本。 如果使用-target 1.4 (或更低版本),则会在类型初始化期间调用的静态方法中Class.forName()的调用插入到代码中。 如果使用-target 1.5 (或更高版本),则常量池将获得“类”条目。 我不知道如何处理这个细节。

编写MyClass.class会给出Class类型的对象。

所以,在上面的代码中,如果要正确使用generics,那么应该说:

 Class c = MyClass.class; 

要么

 Class c = MyClass.class; 

class关键字将给出为Class建模的Class对象。

正如Jon Skeet所述, 第15.8.2节: Java语言规范的类文字说明了关于类文字的以下内容:

类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型void组成,后跟“。”。 和令牌class 。 类文字的类型, C.Class ,其中C是类,接口或数组类型的名称,是Class

类文本计算为由当前实例的类的定义类加载器定义的命名类型(或void)的Class对象。

是的,没有“类”实例变量可以这么说。 实际上它存在于每个class级。 MyClass.class直接为MyClass获取Class实例。 我不确定你对reflection有多熟悉,但这可以让你开始使用它。 您可以查看本教程,了解您可以执行的操作的一些示例: http : //www.ibm.com/developerworks/library/j-dyn0603/

Reflection允许程序在运行时查看和修改自己的行为。 它是一种“元编程”。

为了增加其他人已经说过的内容,“MyClass.class”在语义上与:

 Class.forName("MyClass", false, classloader); 

其中“classloader”是调用类的ClassLoader实例。

主要的区别在于exception处理 – 上面的代码片段抛出ClassNotFoundException,但我不相信MyClass.class可以抛出它(它可能抛出ClassDefNotFoundError,但是,这是一个更普遍的问题)。 此外,MyClass.class使用import语句,而Class.forname()要求您传入完全限定的类名。


当我被提醒时,MyClass.class没有初始化MyClass,因此不会调用静态初始化程序。