2014-01-27 41 views
0
interface A { 
} 

public class B { 
    public static void main(String a[]) { 
     Class c = Class.forName("A"); 
     System.out.println(c.isInterface());//false 
     Class c1 = A.class; 
     System.out.println(c1.isInterface());//true 
    } 
} 

O/P: 假 真反射API,的Class.forName()VS的.class

期待O/P: 真 真

我wan't知道差在這兩個中: Class.forName(「A」)和A.class 非常感謝。

+0

你確定這是你正在運行的代碼?包裝中是否有這些類型? –

+0

這給你一個不同的很好的解釋:http://stackoverflow.com/questions/10947768/difference-between-a-getclass-and-a-class – KrisM82

+0

你的代碼不會編譯。 –

回答

2

如果編寫A.class編譯器需要在編譯時知道A.

如果您編寫Class.forName("A"),那麼它只在運行時才需要。

+0

您尚未回答OP的問題。他想知道爲什麼A.class.isInterface()和Class.forName(「A」)。isInterface()返回不同的值。 – Raman

+0

我認爲這個問題更多的是關於輸出。 –

+0

引用OP:「我不想知道這兩者的區別:Class.forName(」A「)和A.class非常感謝。」 – richardtz

0

它給Runtime error環繞與try和catch或Java中拋出

不要這樣,讓true true

interface A{ 
} 

public class B{ 
public static void main(String a[]) throws ClassNotFoundException{ 
Class c= Class.forName("A"); 
System.out.println(c.isInterface()); 
Class c1=A.class; 
System.out.println(c1.isInterface()); 
} 
} 

輸出

true 
true 
3

Class.forName()嘗試解析類在運行時,使用默認的類加載器。它可能會成功,或者可能會失敗,具體取決於期望的類是否有效並且在您的類路徑中。

.class運算符將類描述符評估爲編譯時常量。如果所引用的類無效且存在於類路徑中,它仍然可能在運行時失敗,但它可以用於需要常量表達式的地方(例如,在註釋值中),並且它通常在重構方面更具彈性。請注意,捕獲的類描述符取決於編譯器的輸入和類路徑;使用不同的編譯器參數,相同的代碼可能會引用兩個不同的類。

在你的用例中,兩者都應該解析爲同一個類。您的結果是意想不到的,並且可能表示類路徑中存在名爲A的另一個類。我懷疑你在你的問題中引用的接口A實際上是位於一個包中,在這種情況下,你將錯誤的描述符傳遞給forName()。該名稱應該是包限定的。