Java中的.class是什么意思?

时间:2013-02-26 00:01:42

标签: java class methods

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

8 个答案:

答案 0 :(得分:129)

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

答案 1 :(得分:47)

当没有可用类的实例时,使用

.class。
当有一个类的实例可用时,使用.getClass()。

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

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

这将输出

class java.lang.String

这是字符串对象的类:)

答案 2 :(得分:5)

如果对象的实例可用,那么获取其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

答案 3 :(得分:5)

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

这个'.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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分: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 引用也在方法参数中,这将以类似的方式工作。

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

答案 7 :(得分:0)

类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型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