2011-03-21 16 views
10

假設我有一個類「僱員」有一個對象obj。 那麼如何執行obj.getClass()。getName()語句?它應該返回什麼?Class.getName()對給定的類做什麼?

+0

它返回的對象是一個Object?或者Object的任何子類? – justkt 2011-03-21 17:42:15

+1

你必須更具體。添加一些細節,以便理解你在找什麼...... – Thomas 2011-03-21 17:42:19

+0

我不清楚你的意思是「如何執行一個聲明」。您是否問JVM如何在運行時執行動態分派?編譯器如何生成字節碼?或者簡單地說,如何編寫可以調用它的代碼(儘管後者看起來很簡單)? – 2011-03-21 17:43:01

回答

19

getClass()方法獲取對象的實際類,它可能與保存對象的變量的類不同。該getName()方法將返回完整的包加上類名類的作爲一個字符串,象這樣:

com.company.project.package.MyClass

例如,下面的代碼輸出上述字符串:

 
package com.company.project.package; 

class MyClass extends Object { 
    // some definition 
} 

Object o = new MyClass(); 
System.out.println(o.getClass().getName()); 
-1

名稱在你的情況下,「僱員」或「my.package.employee」。

0

免責聲明:雖然埃裏克的答案是正確的,但它並不完整。

總之

此方法類似於另一方面,getCanonicalName()用差 - 它返回類,其中規範版本返回null(例如,用於匿名類)的二進制名稱。

詳細

如果該類對象表示引用類型不是數組類型,則返回的類的二進制名稱:

String.class.getName() 
    returns "java.lang.String" 
(new Object() {}).getClass().getName() 
    returns "test.Main$1" 

如果該類對象表示一個基本類型或void,那麼返回的名稱就是一個String,它等於對應於原始類型或void的Java語言關鍵字。

byte.class.getName() 
    returns "byte" 
long.class.getName() 
    returns "long" 

如果該類對象表示一類陣列的,則該名稱的內部形式包括由一個或多個「[」表示該數組嵌套的深度字符之前的元素類型的名稱:

(new Object[3]).getClass().getName() 
    returns "[Ljava.lang.Object;" 
(new int[3][4][5][6][7][8][9]).getClass().getName() 
    returns "[[[[[[[I" 

元素類型名的編碼如下:

Element Type   Encoding 
boolean    Z 
byte     B 
char     C 
class or interface  L<classname>; 
double     D 
float     F 
int     I 
long     J 
short     S 

在此方法正式文檔:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getName--