2016-11-08 36 views

回答

1

只要把它理解为“一个包含对象类型的所有元数据的对象”。在该对象中,您可以找到在类中声明的方法,字段,类型层次结构等。 这些信息通常用于使用反射来检查对象/类型或运行方法的代码,而不需要当他们自己被编码时,这个类被定义和编译。

“运行”可以强调,因为类定义可能会随时间而改变,或者对象可以声明为超类,而它实际上是一个声明的子类型的实例。当加载某个类时,就是在该实例中加载的那个信息,它将由getClass()方法返回。

简而言之,当您的代码运行时,VM将以与您在.java文件中键入的“源”形式不同的方式定义类。这些信息当然是在编译后加载的,所有元数据(如上所述)将构成他们称之为“运行时类”的东西。 这只是一个奇特的方式来说“一个对象与程序运行时加载的类有关的所有元数据”

3

你写的每个类都有很多元数据。该元数据由类名,它的字段,它的方法,它的基类,它实现的接口等组成。

有时您可能需要在运行时从您的代码访问元数据。

为了做到这一点,您可以采取任何对象并调用其getClass()方法。您将收到一个包含上述元数据的Class对象。

+0

它将表示运行时类,而不是引用类。 'Object o = new String()'=>你将得到String,而不是Object。 – Fildor

3

它的意思是“变量在运行时引用的实例的类”(抱歉,如果这不是更清楚)。

如果你有一个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. 
1

对象的类可以在运行时更改。考虑以下示例:

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()的输出在运行时更改。

相关问题