2014-12-03 40 views
1

每當我試圖用原語類型等booleanClass.forName()語法和與getClass(),編譯時間錯誤產生,但是當我使用.class語法,它的工作和輸出是boolean原始類型在反射API

我的問題是爲什麼它與.class語法一起工作?我認爲在String.class中應始終有一個對象來代替String

public class reflect2 
{ 
    public static void main(String[] args) 
    {  
      Class c1 = boolean.class;  
      System.out.println(c1.getName());  
    } 
} 
+0

「*反射API只能應用於對象*」 - 是一個錯誤的句子。 API不適用於對象。 – Maroun 2014-12-03 07:47:44

+0

boolean.class編譯爲Boolean.TYPE – 2014-12-03 07:49:42

回答

2

getClass()是在java.lang.Object中定義的方法,只能在實例上調用方法。

.class類文字的一部分,它不是方法調用,它也可以用於基元類型。

The Java™ Language Specification Section 15.8.2. Class Literals引用:

類字面是由類,接口,數組名的表達,或原始類型,或僞型void,隨後一個'.'和令牌class

最後從Class.forName()的Javadoc qutoing:

返回與接口與給定字符串名稱相關聯的Class對象。

所以Class.forName()僅適用於類和接口和基本類型。

3

這在Oracle Java tutorials中提到:

的語法的.class

如果類型是可用的,但沒有實例則可以 通過獲得一類將「.class」附加到該類型的名稱。 這個 也是獲取原始類型的類的最簡單的方法。

boolean b;
Class c = b.getClass(); //編譯時錯誤
Class c = boolean.class; //正確

請注意,boolean.getClass()語句會產生編譯時錯誤,因爲布爾是原始類型,無法解除引用。 .class語法返回對應於布爾類型的類。

您需要能夠以某種方式表示基元的類型,因爲例如當您使用反射來搜索具有基元參數類型的方法或構造函數時,它是必需的。

+0

將boolean.class替換爲Boolean.class。 – Aamir 2014-12-03 07:55:36

+0

@Aamir否,'boolean.class'與'Boolean.class'不一樣,如果你寫'boolean.class',它不會被'Boolean.class'自動替換。 – Jesper 2014-12-03 08:02:03

+0

@Eran謝謝.... – Aamir 2014-12-03 08:04:26