177

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

4

8 回答 8

174

当您写.class在类名之后时,它会引用类文字 - java.lang.Class表示有关给定类的信息的对象。

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

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
于 2013-02-26T00:03:21.833 回答
63

.class当没有可用的类的实例时使用。

.getClass()当有可用的类的实例时使用。

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

例如:

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

这将输出:

class java.lang.String

这是字符串对象的类:)

于 2013-02-26T00:08:54.170 回答
10

澄清一下,这个 '.class' 方法并不是指您在编译 java 代码后看到的字节码文件,也不是 OOP 理论中类与对象概念之间的混淆。

这个 '.class' 方法在 Java 中用于代码反射。通常,您可以为您的类收集元数据,例如完整的类名、常量列表、公共字段列表等。

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

通常,您不打算在开始构建项目时立即使用反射。这是您在尝试管理已经工作的代码后知道需要的东西。很多时候,您需要它来管理程序的多个实例。也许您想识别每个特定的“克隆”以确定是否已经定义了某些内容,或者计算函数的数量,或者只是简单地记录类的特定实例的详细信息。

于 2016-09-20T19:18:22.977 回答
6

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

.class语法_

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

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

Class c = boolean.class;  // correct

参见:docs.oracle.com 关于类

于 2015-11-05T23:55:08.060 回答
3

如果没有可用的实例,则.class使用语法获取类的相应 Class 对象,否则您可以使用 getClass() 方法获取 Class 对象。由于没有原始数据类型的实例,我们必须使用.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());
       }
    }
于 2016-05-03T11:31:26.137 回答
2

添加到上述答案:

假设您有一个名为“myPackage.MyClass”的类。假设在类路径中,以下语句是等价的。

//checking class name using string comparison, only Runtime check possible
if(myInstance.getClass().getName().equals(Class.forName("myPackage.MyClass")).getName()){}

//checking actual Class object for equality, only Runtime check possible
if(myInstance.getClass().getName() == Class.forName("myPackage.MyClass"))){}

//checking actual Class object for equality, but compile time validation
//will ensure MyClass is in classpath. Hence this approach is better (according to fail-fast paradigm)
if(myInstance.getClass() == MyClass.class){}

同样,以下也是等价的。

Class<?> myClassObject = MyClass.class; //compile time check

Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check

如果 JVM 加载一个类型,代表该类型的类对象将出现在 JVM 中。我们可以从反射包中非常常用的类对象中获取有关类型的元数据。MyClass.class 是一个简写方法,它实际上指向代表 MyClass 的 Class 对象。

作为附录,有关 Class<?> 参考的一些信息将有助于阅读,因为大多数情况下它们是一起使用的。

Class<?> 引用类型可以包含代表任何类型的任何 Class 对象。

如果 Class<?> 引用也在方法参数中,则这以类似的方式工作。

请注意,“Class”类没有公共构造函数。所以你不能用“new”操作符来实例化“Class”实例。

于 2021-01-02T07:40:39.770 回答
1

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

于 2014-12-04T19:34:51.720 回答
1

类字面量是由类、接口、数组或原始类型或伪类型 void 的名称组成的表达式,后跟一个“.”。和令牌类。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

于 2016-10-13T09:02:53.983 回答