2 還有一種情況,假如生成了物件,例如:Integer i = new Integer(0) ; 這時,你會發現i裡面沒有class這個屬性了。同時,會多出一個【i.getClass()】方法,該方法同樣得到了變數 i 這個型別的Class物件。System.out.println(i.getClass().getName());,得到的結果是java.lang.Integer。
透過檢視getClass()原始碼得知。該方法是繼承Object的方法public final native Class<?> getClass();並且已經被修飾成final和native,說明該方法只能由JVM底層呼叫,程式設計師不能改寫,只能使用。透過檢視原始碼可以說明了,這個class屬性是由jvm生成,而程式設計師控制不了。
問題很專業。我來回答一下,如果能幫到你就更好,如不能幫你解惑,看看也行了。
java所有的型別在類載入的時候,會自動載入一個靜態屬性class,無論是int還是Integer,因為在java中,所有的型別都對應了一個java.lang.Class物件。正是對應這個物件。我們才能更方便地使用java反射機制。
1 要得到Class這個物件,我們可以使用【類.class】,例如Class cls = int.class;這樣可以得到cls物件。如果System.out.println(cls.getName());,結果是int。如果使用Class cls = Integer.class;得到的結果是java.lang.Integer。
2 還有一種情況,假如生成了物件,例如:Integer i = new Integer(0) ; 這時,你會發現i裡面沒有class這個屬性了。同時,會多出一個【i.getClass()】方法,該方法同樣得到了變數 i 這個型別的Class物件。System.out.println(i.getClass().getName());,得到的結果是java.lang.Integer。
透過檢視getClass()原始碼得知。該方法是繼承Object的方法public final native Class<?> getClass();並且已經被修飾成final和native,說明該方法只能由JVM底層呼叫,程式設計師不能改寫,只能使用。透過檢視原始碼可以說明了,這個class屬性是由jvm生成,而程式設計師控制不了。
經過上面的分析,應該清楚了class的作用和由來。
後面因涉及到jvm的底層程式碼的本地呼叫,本人才疏學淺,還將繼續學習。
希望以上解答能幫到你!