Car*_*zer 72 java inheritance class
Java文档Class说:
ClassJava虚拟机在加载类时自动构造对象,并通过调用defineClass类加载器中的方法.
这些Class物品是什么?它们是否与通过调用从类实例化的对象相同new?
另外,例如,即使我不继承,object.getClass().getName()如何将所有内容都转换为超类?Classjava.lang.Class
Boz*_*zho 88
什么都没有被贬低Class.ObjectJava中的每一个都属于某种特定的class.这就是为什么Object所有其他类继承的类定义了该getClass()方法.
getClass(),或class-literal - Foo.class返回一个Class对象,其中包含有关该类的一些元数据:
和一些有用的方法等铸造和各种检查(isAbstract(),isPrimitive()等).javadoc确切地显示了您可以获得的关于类的信息.
因此,例如,如果您的方法被赋予了一个对象,并且您希望在使用该@Processable注释进行注释的情况下对其进行处理,那么:
public void process(Object obj) {
if (obj.getClass().isAnnotationPresent(Processable.class)) {
// process somehow;
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,您将获取有关给定对象的类的元数据(无论它是什么),并检查它是否具有给定的注释.Class实例中的许多方法称为"反射操作",或简称为"反射.请阅读此处关于反射,使用的原因和时间.
还要注意,枚举和接口也表示一个Class对象,并具有相应的元数据.
总结一下 - java中的每个对象都有(属于)一个类,并且有一个相应的Class对象,它包含有关它的元数据,可以在运行时访问.
Jan*_*omä 41
Class对象是一种描述对象类的元对象.它主要用于Java的反射功能.您可以将其视为实际课程的"蓝图".例如,你有这样的类汽车:
public class Car {
public String brand;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以构造一个描述"Car"类的Class对象.
Class myCarClass = Class.forName("Car");
Run Code Online (Sandbox Code Playgroud)
现在,您可以在该Class对象上对Car类进行各种查询:
myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field
Run Code Online (Sandbox Code Playgroud)
等等.每个java对象都有一个方法getClass(),它返回描述Java对象的Class的Class对象.所以你可以这样做:
Car myCar = new Car();
Class myCarClass = myCar.getClass();
Run Code Online (Sandbox Code Playgroud)
这也适用于您不知道的对象,例如您从外部获取的对象:
public void tellMeWhatThisObjectsClassIs(Object obj) {
System.out.println(obj.getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)
您可以将此方法提供给任何java对象,它将打印您为其提供的对象的实际类.
使用Java时,大多数时候您不需要担心Class对象.他们有一些方便的用例.例如,它们允许您以编程方式实例化特定类的对象,这些对象经常用于对象序列化和反序列化(例如,将Java对象转换为XML并返回,大部分时间都是这样).
Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car();
Run Code Online (Sandbox Code Playgroud)
您还可以使用它来查找类的所有声明的字段或方法等,这在某些情况下非常有用.因此,例如,如果您的方法被传递给一个未知对象,并且您需要了解更多信息,比如它是否会影响某些界面等,那么Class类就是您的朋友.
长话短说,java.lang.reflect包中的Class,Field,Method等类允许你分析你定义的类,方法,字段,创建它们的新实例,调用各种其他东西的方法它们允许您在运行时动态执行此操作.
getClass()是一个返回对象的方法,该对象是...的实例,java.lang.Class不涉及转换.投射看起来像这样:
Class<?> type = (Class<?>) object;
Run Code Online (Sandbox Code Playgroud)
我还想补充一下ColinD的答案,即getClass将为相同类型的实例返回相同的对象。这将显示true:
MyOtherClass foo = new MyOtherClass();
MyOtherClass bar = new MyOtherClass();
System.out.println(foo.getClass()==bar.getClass());
Run Code Online (Sandbox Code Playgroud)
请注意,不是equals,我正在使用==。