Java中的.class是什么意思?

Java中的.class是什么意思? 例如,如果我创build了一个名为Print的类。 Print.class返回什么?

在类名后面写.class ,它会引用表示关于给定类的信息的类文字 – java.lang.Class对象。

例如,如果您的类是Print ,则Print.class是一个代表运行时Print类的对象。 它是由Print的任何(直接)实例的getClass()方法返回的同一个对象。

 Print myPrint = new Print(); System.out.println(Print.class.getName()); System.out.println(myPrint.getClass().getName()); 

.class在没有可用类的实例时使用。
.getClass()在有可用类的实例时使用。

object.getClass()返回给定对象的类。 例如:

 String string = "hello"; System.out.println(string.getClass().toString()); 

这将输出

 class java.lang.String 

这是string对象的类:)

如果一个对象的实例可用,那么获取其类的最简单方法是调用Object.getClass()

.class语法

如果types可用,但没有实例,则可以通过将.class附加到types的名称来获取类。 这也是获取原始types的类最简单的方法。

 boolean b; Class c = b.getClass(); // compile-time error Class c = boolean.class; // correct 

请参阅: docs.oracle.com关于类

只是为了澄清,这个'.class'方法并不是指在编译java代码之后看到的字节码文件,也不是OOP理论中Class和Object的概念之间的混淆。

这个'.class'方法在Java中用于代码Reflection。 一般来说,您可以为您的课程收集元数据,例如完整的合格类名称,常量列表,公共字段列表等。

检查这些链接(上面已经提到)获取所有的细节:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

通常,当您开始构build项目时,您不打算立即使用Reflection。 在尝试pipe理已经运行的代码之后,你知道你需要的东西。 很多时候你需要它来pipe理你的程序的多个实例。 也许你想识别每个特定的“克隆”,以确定是否已经定义了一些东西,或者计算函数的数量,或者只是简单地logging你的类的特定实例的细节。

我认为这里的关键是理解一个类和一个对象之间的区别。 一个对象是一个类的实例。 但是在完全面向对象的语言中, 类也是一个对象 。 所以调用.class获得对该类的Class对象的引用,然后可以对其进行操作。

如果没有可用的实例,则使用.class语法获取类的相应Class对象,否则可以使用getClass()方法获取Class对象。 因为没有原始数据types的实例,所以我们必须对基本数据types使用.class语法。

  package test; public class Test { public static void main(String[] args) { //there is no instance available for class Test, so use Test.class System.out.println("Test.class.getName() ::: " + Test.class.getName()); // Now create an instance of class Test use getClass() Test testObj = new Test(); System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName()); //For primitive type System.out.println("boolean.class.getName() ::: " + boolean.class.getName()); System.out.println("int.class.getName() ::: " + int.class.getName()); System.out.println("char.class.getName() ::: " + char.class.getName()); System.out.println("long.class.getName() ::: " + long.class.getName()); } } 

类文字是由类,接口,数组或原始types的名称,或伪types的void,后跟'。'组成的expression式。 和令牌类。 JDK 5.0中的一个变化是类java.lang.Class是通用的, java.lang.Class Class<T> ,因此:

 Class<Print> p = Print.class; 

参考这里:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2