什么是Class对象(java.lang.Class)?

Class的Java文档说:

Class对象由Java虚拟机自动构造,随着类的加载以及对类加载器中的defineClass方法的调用。

这些Class对象是什么? 它们是否与通过调用new从一个类实例化的对象相同?

另外,比如object.getClass().getName()如何将所有的东西都types化为超Class ,即使我不从java.lang.Class

没有什么会被types化。 Java中的每个Object都属于某个class 。 这就是为什么被所有其他类inheritance的Object类定义了getClass()方法。

getClass()或类文字Foo.class返回一个Class对象,其中包含一些关于类的元数据:

  • 名称
  • 方法
  • 领域
  • build设者
  • 注释

和一些有用的方法,如投射和各种检查( isAbstract()isPrimitive()等)。 javadoc显示了你可以获得什么类的信息。

所以,举个例子,如果你的方法被赋予了一个对象,并且你想要用@Processable注解来处理它,那么:

 public void process(Object obj) { if (obj.getClass().isAnnotationPresent(Processable.class)) { // process somehow; } } 

在这个例子中,您可以获得有关给定对象的类的元数据(不pipe它是什么),并检查它是否有给定的注释。 一个Class实例的许多方法被称为“reflection操作”,或者简单地称为“reflection”。 在这里阅读关于reflection,为什么以及何时使用它。

还要注意,枚举和接口也表示一个Class对象,并具有相应的元数据。

总结一下 – java中的每个对象都有(属于)一个类,并且有一个相应的Class对象,它包含关于它的元数据,可以在运行时访问。

Class对象是描述对象类的元对象。 它主要用于Java的reflectionfunction。 你可以把它想象成实际课程的“蓝图”。 例如,你有一个类像这样的汽车:

 public class Car { public String brand; } 

然后你可以构造一个描述你的“Car”类的Class对象。

 Class myCarClass = Class.forName("Car"); 

现在你可以在你的Car类上对这个Class对象进行各种查询:

 myCarClass.getName() - returns "Car" myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field 

等等。 每个java对象都有一个方法getClass(),它返回描述Java对象Class的Class对象。 所以你可以做这样的事情:

 Car myCar = new Car(); Class myCarClass = myCar.getClass(); 

这也适用于你不知道的物体,例如你从外面得到的物体:

 public void tellMeWhatThisObjectsClassIs(Object obj) { System.out.println(obj.getClass().getName()); } 

你可以给这个方法提供任何java对象,它将打印你给它的对象的实际类。

在使用Java时,大部分时间你不需要担心Class对象。 不过他们有一些方便的用例。 例如,它们允许您以编程方式实例化某个类的实例对象,这经常用于对象序列化和反序列化(例如,将Java对象转换为XML,然后返回,大部分返回)。

 Class myCarClass = Class.forName("Car"); Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car(); 

你也可以用它来找出所有声明的字段或类的方法等,这在某些情况下是非常有用的。 所以,例如,如果你的方法得到一个未知的对象,你需要知道更多关于它,如果它插入一些接口等,Class类是你的朋友在这里。

所以长期以来,java.lang.reflect包中的Class,Field,Method等类允许您分析定义的类,方法,字段,创build它们的新实例,调用各种其他的东西而且它们允许您在运行时dynamic地执行此操作。

getClass()是一个返回一个对象的方法,该对象是一个java.lang.Class的实例…没有涉及到任何投射。 铸造看起来像这样:

 Class<?> type = (Class<?>) object; 

我也想添加到ColinD的答案,即getClass将返回相同types的实例相同的对象 。 这将打印真实

  MyOtherClass foo = new MyOtherClass(); MyOtherClass bar = new MyOtherClass(); System.out.println(foo.getClass()==bar.getClass()); 

请注意,这不是等于 ,我正在使用==

Class对象是Class(java.lang.Class)的一个实例。 下面的引用来自javadoc的类应该回答你的问题

类没有公共构造函数。 相反,Class对象是由Java虚拟机自动构造的,因为在加载类时以及通过调用类加载器中的defineClass方法。