2013-01-06 58 views
-1

我有以下代碼:使用Class對象時,我們可以使用一個帶有Class名稱的String嗎?

for(President obj : SomeClass.SomeObject(President.class)) 
{ 
    System.out.println(obj.getFullText()); 
} 

這裏有各種各樣的班,事實上一個巨大的名單,如總裁,汽車,火車,產品,MaleName,FemaleName,等等。所有這些類都有getFullText()方法。

現在,而不是寫:

for(President obj : SomeClass.SomeObject(President.class)) 
{ 
    System.out.println(obj.getFullText()); 
} 

for(Car obj : SomeClass.SomeObject(Car.class)) 
{ 
    System.out.println(obj.getFullText()); 
} 

.. and so on 

我想,可以採取像「總統」,「汽車」,「產品」,等等,所有的名稱的字符串表示的通用短方法然後在該特定的類對象「obj」上調用此方法,以便在循環內我可以按照此方法的返回值執行所需操作。

+2

你想要[反射](http://en.wikipedia.org/wiki/Reflection_(computer_programming))。有可能的。 –

回答

5

答案是使用reflection。但是這很複雜,如果你不小心,會導致各種微妙的問題。

最好的政策是重新考慮你的設計,以避免需要這樣做。一種選擇是使用factory pattern

4

假設類有不帶任何參數的公共構造函數,稱爲com.mydomain.app.Car,在follwoing加載類並調用構造函數:

Class<?> clazz = Class.forName("com.mydomain.app.Car"); 
Car car = (Car) clazz.newInstance(); 

這就是所謂的反射。但它應該非常少地用於特殊類型的問題。你應該告訴我們你想實現的目標,這樣我們可以幫助你以更安全的OO和高效的方式來做到這一點。例如,你可以使用工廠模式:

public interface Drivable { 
    public void drive(); 
} 

public class Car implements Drivable { 
    ... 
} 

public class Bus implements Drivable { 
    ... 
} 

public class DrivableFactory { 
    public static Drivable create(String kind) { 
     if ("bus".equals(kind)) { 
      return new Bus(); 
     } 
     else if ("car".equals(kind)) { 
      return new Car(); 
     } 
     else { 
      throw new ImmegalArgumentException("sorry, I can't create " + kind); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Drivable d = DrivableFactory.create(args[0]); 
     d.drive(); 
    } 
} 
+0

謝謝。我會試試這個。看起來這正是我想知道的 - 反思!我將傳遞各種類的名稱作爲forName()方法的參數並獲取一個通用的clazz對象。我稍後將使用這個clazz對象來調用我知道存在於所有我想引用的類中的特定方法。我希望我現在想清楚的是。你同意這是實施的最佳方法嗎? –

+0

不,這不是最好的辦法。所有類都應該實現一個通用接口,並且您應該有一個工廠根據字符串輸入返回相應類的新實例。 –

+0

你應該看看接口和工廠模式來解決這個問題。像這樣創建類感覺很髒。 –

相關問題