使用Java的RTTI(運行時類型信息)要注意的地方

  • 如果要使用Class的應用來構造一個對象的示例, 那麼這麼對象對應的類必須有一個無參數的構造函數,例如: 

Class ref=XXX.class;
XXX xxxref=ref.newInstance();
//那麼在XXX類裏面應該有一個無參數的構造函數

             (還要注意這裏的ref應該採用泛型來定義,因爲newInstance()返回的的是Object類型, 上面的例子需要手動進行類型轉換)
  •  instanceof 關鍵字後面應緊跟 類型的名稱  而不是類型的class應用 例如

String t="aaa";
if(t instanceof String )//正確
//if(t instanceof String.class)//錯誤
  • 判斷類型還可以用class的isInstance()方法 ,例如:


String t="ddd";
Class classRef=String.class;
if(classRef.isInstance(t))...


  • 我們比較對象的類型的時候一般有四種方法
  1. 用instanceof操作符
  2. 使用Class的inInstance()方法
  3. 使用“==”運算符來判斷對象的Class
  4. 使用equals()方法來判斷對象的Class

但是要主要他們的區別,如下面的代碼所示

package come.afeiluo;

class A {
}

class B extends A {
}

public class TestClass2 {

	static void compareType(Object o) {
		Class oc = o.getClass();
		System.out.println("identify " + oc);
		System.out.println("object instanceof A "
				+ (o instanceof A));
		System.out.println("object instanceof B "
				+ (o instanceof B));
		System.out.println("A isInstance object " + A.class.isInstance(o));
		System.out.println("B isInstance object " + B.class.isInstance(o));
		System.out.println("A==object " + (A.class == oc));
		System.out.println("B==object " + (B.class == oc));
		System.out.println("A equals object " + (A.class.equals(oc)));
		System.out.println("B equals object " + (B.class.equals(oc)));
	}

	public static void main(String[] args) {
		compareType(new A());
		System.out.println("=======================================");
		compareType(new B());

	}

}

再看一下輸出的結果:

identify class come.afeiluo.A
object instanceof A true
object instanceof B false
A isInstance object true
B isInstance object false
A==object true
B==object false
A equals object true
B equals object false
=======================================
identify class come.afeiluo.B
object instanceof A true
object instanceof B true
A isInstance object true
B isInstance object true
A==object false
B==object true
A equals object false
B equals object true

我們可以看到在對類型B進行判斷的時候  用instanceof 和isInstance()進行判斷的結果是一樣的,而 用“==”和equals()方法判斷的結果是一樣的,這是由於應instanceof 和inInstance()判斷的是這個類是某一種類型,或者是這種類型的子類型,而用“==”和equals()方法判斷的時候則是比較的是這個類是不是某種確切的類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章