2012-07-18 91 views
3

獲得實例類的最佳方式是什麼?如何在Java中獲取對象類?

推薦的方法是什麼?和是什麼之間的差異(表演):

  • 比較類

if(this.getClass().equals(MyClass.class)){ 這似乎是相同的this.getClass() == MyClass.class(或者使用Class.forName("com.test.MyClass")

  • 測試的實例(似乎更具可讀性)

    使用
    if(this instanceof MyClass){ 
    
  • 測試實例類

    if(MyClass.class.isInstance(myInst)){ 
    
+3

你如何得到這個類的問題和比較類的例子似乎是矛盾的。你想知道什麼?如何比較類型? – nfechner 2012-07-18 13:55:16

+2

'應該避免使用Class.forName(「com.test.MyClass」)',因爲'String'比'MyClass.class'難以重構更改。 – Simulant 2012-07-18 13:55:20

+0

@nfechner我想知道我正在處理哪個繼承類:這段代碼是超類。 – 2012-07-18 14:09:59

回答

1

選項一隻告訴你,如果類是正是你正在測試。這通常不是很有用。例如,接口完全沒有意義。如果這實際上是你想要做的,你可以使用==,除非你用不同的ClassLoaders搞亂了,在這種情況下,每個Class對象可能有不止一個實例。

選項二告訴你對象是否可以靜態分配給給定的類(即可以轉換爲它)。

選項三與2相同,但使用reflection API。如果你正在進行動態輸入,你只需要這個。內置的instanceof更具可讀性,應該更有效率。

2

當你想匹配的一類,因爲正是因爲String類是對象的亞型"someString" instanceOf Object會產生真正的我會建議this.getClass().equals(MyClass.class)

這是檢查is a任何實例和類之間的關係。

在你的情況的MyClass任何子類會產生true

  1. instanceof測試左邊的事情是否是正確的或某些亞型類型的實例。
  2. getClass() == ...測試類型是否相同。
+0

你也可以澄清爲什麼你認爲你的方式取代了其他的可能性 – 2012-07-18 14:00:21