什么是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方法。