【问题标题】:What does .class mean in Java?.class 在 Java 中是什么意思?
【发布时间】:2013-02-11 07:16:16
【问题描述】:

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

【问题讨论】:

  • 这对我来说确实是一个真实的问题。我只是自己问这个问题,在快速谷歌搜索后发现自己在这里。如果我知道我的问题不是真的,我想我不应该打扰!
  • 另外,我认为由于特定搜索字符串的尴尬,关于这个问题几乎没有书面或可找到的内容。除了上面链接的 API 文档之外,我从未在其他任何地方看到过这种表示法(尽管您经常看到它在反射中使用)。
  • @MadProgrammer OP 询问 .class 语法,该语法只是偶然与 .class 文件扩展名相关。
  • 类似于 C# 中的 typeof(MyType)。 (即:静态获取“类型”对象)

标签: java class methods


【解决方案1】:

补充以上答案:

假设您有一个名为“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”类没有公共构造函数。所以你不能用“new”操作符来实例化“Class”实例。

【讨论】:

    【解决方案2】:

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

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

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

    例如:

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

    这将输出:

    class java.lang.String
    

    这是字符串对象的类:)

    【讨论】:

    • getClass() 仅在您有指向类对象的引用时才有用。即使类没有实例,也可以使用ClassName.class。例如,考虑Math.class。在某些情况下,每个都是正确的。
    • 精彩的解释。切中要害。喜欢你如何区分.class.getClass().
    【解决方案3】:

    当你在类名后面写.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());
    

    【讨论】:

    • 类对象可以做哪些事情?
    • @Kevin 请参阅java.lang.Class 的 API 文档。
    • 那么Print.class的类型是什么?
    • Android 是如何处理new Intent(this, Activity.class 的?它会尝试通过比较每个类来找出class Activity吗?
    • @ZhipengYANG,类型为Class&lt;Print&gt;
    【解决方案4】:

    类字面量是一个表达式,由类名、接口名、数组名或原始类型或伪类型 void 组成,后跟一个 '.'和令牌类。 JDK 5.0 的变化之一是类 java.lang.Class 是通用的,java.lang.Class Class&lt;T&gt;,因此:

    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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

        如果没有可用的实例,则使用.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());
               }
            }
        

        【讨论】:

          【解决方案7】:

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

          .class 语法

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

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

          见:docs.oracle.com about class

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • in a fully object-oriented language, a Class is also an Object?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-28
            • 1970-01-01
            • 1970-01-01
            • 2012-08-13
            • 2020-02-10
            • 2019-06-16
            相关资源
            最近更新 更多