2017-10-13 32 views
0

如何讓用戶插入字符串並檢查具有相同「名稱」的類?有關類方法「forName()」的問題

想象一下,我有一個方法標記爲public A[] getB(String bString)和兩個類,AB,其中B extends A

在這種方法我想搜索通過現有A[]對於那些從class B回報是與A[]上溯造型對象表示的對象。

我通過互聯網搜索,發現類Class有方法forName(),但我真的不明白如何使用它。例如,我這樣做:

Class<?> cl = Class.forName(bString); 

bStringString包含BB另一個類

我的問題是:

  • 到底是什麼對象 「瘦肉精」 呢?

  • 我該如何檢查對象是否與它具有相同的類?

回答

1

到底是什麼對象 「瘦肉精」 呢?

clClass類的一個實例。

我該如何檢查對象是否與它具有相同的類?

你有2對象o1o2可以使用getClass()

o1 != null && o2 != null && o1.getClass().equals(o2.getClass()) 
+0

非常感謝! –

1

Class.forName(String)返回Class對象爲相應的類,如果已知的方法。從其documentation引用:

返回與類或接口與指定的字符串name相關的Class對象。

一個例子是:

Class threadClass = Class.forName("java.lang.Thread"); 

注意類的名稱必須是完全合格,不只是Threadjava.lang.Thread

您所得到的對象就像所說的那樣是對應類的表示。您可以使用它來動態創建實例,檢查方法等。這裏是它的documentation這裏有一個例子:

Class<?> threadClass = Class.forName("java.lang.Thread"); 

// Dynamically create a thread, unchecked cast 
Thread thread = (Thread) threadClass.newInstance(); 

您可以檢查兩個對象是否是同一類的通過使用每個對象有getClassdocumentation)方法:

if (first.getClass().equals(second.getClass()) { 
    // Same 
} else { 
    // Different 
} 

但是請注意,這個比較是嚴格。如果您比較IntegerNumber,雖然Integer extends Number會拋出false。如果你想要一個不太嚴格的變種,你可以使用instanceof操作:

if (first instanceof second) { 
    // Is type of 
} else { 
    // Not type of 
} 
1

你肯定不會願意使用isInstance

你可以改變你的方法來取得一個類而不是一個字符串,因爲這就是你真正使用的是一個類。

public A[] getB(Class type){ 
    // I'm assuming you have an array of all As somewhere, called Aarray here 
    List<A> BList = new ArrayList<>(); 
    for(int i = 0; i < Aarray.length; i++){ 
     if(type.isInstance(Aarray[i])){ 
      BList.add(Aarray[i]); 
     } 
    } 
    return BList.toArray(); 
} 
+0

感謝您的回答!但這裏的重點是從用戶那裏獲取字符串並從那裏繼續。這將工作,但它仍然會錯過從字符串到類的中間點。有人已經回答了我的要求,如果你想檢查出來,我標記了它。 –