.class在Java中是什么意思?


149

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



恐怕我不完全了解您的要求。如果您能进一步详细说明,也许有人可以为您提供更多有用的信息
Paul Walker

28
在我看来,这无疑是一个真实的问题。我只是在问自己一个问题,然后在Google快速搜索后发现自己在这里。我想如果我知道我的问题不是真实的,我应该不会打扰!
琼斯医生

1
另外,我认为由于特定搜索字符串的尴尬,有关此问题的文献很少或找不到。除了上面链接的API文档之外,我从未在其他任何地方提到过这个符号(尽管您经常看到它是在反射中使用的)。
jordanpg 2014年

2
OP正在询问@MadProgrammer,该.class语法仅与.class文件扩展名有关。
jordanpg 2014年

Answers:


143

当您.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());

2
一个类对象可以做些什么?
凯文

7
@Kevin请参阅java.lang.Class的API文档。
Patricia Shanahan

应用程序:访问私有字段,例如:Writer.class.getDeclaredField("writeBuffer")
jordanpg 2014年

2
那是什么类型Print.class呢?
杨志鹏

1
Android如何处理new Intent(this, Activity.class?是否会尝试class Activity通过比较每个班级找出答案?
杨志鹏

56

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

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

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

例如:

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

这将输出:

class java.lang.String

这是字符串对象的类:)


7
getClass()仅当您具有指向该类对象的引用时才有用。ClassName.class即使该类没有实例也可以使用。例如,考虑Math.class。每种情况在某些情况下都是正确的。
Patricia Shanahan

精彩的解释。给你的权利如何确定的区别it.Love点.class.getClass().
Sevastyan Savanyuk

6

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

.class语法

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

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

Class c = boolean.class;  // correct

参见:关于类的docs.oracle.com


6

只是为了澄清,此“ .class”方法不是引用编译Java代码后看到的字节码文件,也不是OOP理论中类与对象的概念之间的混淆。

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

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

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


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());
       }
    }

1

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


4
in a fully object-oriented language, a Class is also an Object?<需要引用>
Sam Dufel 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.