[英]What is a “runtime class” in Java?
我试着理解Object.getClass()
方法的作用。
文档说它“返回对象的运行时类”。 这个解释并没有帮助我理解这个术语。
有人简单描述了“运行时类”是什么以及getClass()
作用是什么?
它表示“变量在运行时引用的实例的类”(对不起,如果实际上并不清楚)。
如果你有一个对Object
的引用,它可以引用一个Object
,一个String
,一个Integer
......你得到的是该类,而不是Object
。
Object obj1 = new Object();
System.out.println(obj1.getClass()); // java.lang.Object
String obj2 = "";
System.out.println(obj2.getClass()); // java.lang.String
obj1 = obj2;
System.out.println(obj1.getClass()); // java.lang.String, not Object.
您编写的每个类都有很多元数据。 该元数据由类名,其字段,方法,基类,它实现的接口等组成。
有时您可能需要在运行时从代码中访问该元数据。
为此,您可以获取任何对象并调用其getClass()
方法。 您将收到一个包含上述元数据的Class
对象。
只需将其理解为“具有对象类型的所有元数据的对象”。 在该对象中,您可以找到在类,字段,类型层次结构等中声明的方法。此信息通常由使用反射来检查对象/类型或运行方法的代码使用,而无需具有当它们本身被编码时定义和编译的类。
可以强调“运行时”,因为类定义可能随时间而变化,或者对象可能被声明为超类型,而实际上它是所声明的子类型的子类型的实例。 当加载某个类时,它就是在该实例中加载的信息,它将由getClass()方法返回。
简而言之,当您的代码运行时,VM将以与您在.java文件中键入的“源”表单不同的方式定义您的类。 当然,在编译之后,该信息将被加载,并且所有元数据(如上所述)将构成他们称之为“运行时类”的信息。 这只是一种奇特的方式来说“一个对象,其中包含有关在程序运行时加载的类的所有元数据”
对象的类可以在运行时更改。 考虑以下示例:
package demo;
public class Main {
public static class A {
public int a=0;
}
public static class B extends A {
public int b=1;
}
public static void main(String[] args) {
Main.A b=new Main.A();
System.out.println(b.getClass().toString());
b=new Main.B();
System.out.println(b.getClass().toString());
}
}
b.getClass()的输出在运行时更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.