类在 Java 中是什么意思?

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

137561 次浏览

如果没有可用的类实例,则使用 .class

如果类的实例可用,则使用 .getClass()

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

例如:

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

这将产生:

class java.lang.String

这是字符串对象的类:)

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

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

.class语法

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

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


Class c = boolean.class;  // correct

见: 关于课堂

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

澄清一下,这个。Class 的方法并没有引用在编译 java 代码后看到的字节码文件,也没有混淆 OOP 理论中 Class 与 Object 的概念。

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

检查这些链接(上面已经提到) ,以获得所有的细节:
Https://docs.oracle.com/javase/tutorial/reflect/class/classnew.html
Https://docs.oracle.com/javase/8/docs/api/java/lang/class.html

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

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

补充以上答案:

假设您有一个名为“ 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 中。我们可以从反射包中经常使用的类对象中获得关于类型的元数据。Class 是一个速记方法,它实际上指向表示 MyClass 的 Class 对象。

作为附录,一些关于 Class < ? > 的信息参考,这将是有用的一起阅读,因为大多数时间,他们一起使用。

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

如果 Class < ? > 引用也位于方法参数中,那么这种方式也是类似的。

请注意,类“ Class”没有公共构造函数。因此,不能使用“ new”运算符实例化“ Class”实例。