2012-05-07 40 views
1

如果我需要根據String返回一個Class實例(例如,從JSON創建邏輯),那麼應該如何寫?如何從Java中的字符串中獲取類引用?

我最初的想法是一個開關,但在Android框架的Java版本中,它看起來像switch語句不允許使用字符串。

接下來的想法是一個HashMap:

private HashMap<String, Class> classMap = new HashMap<String, Class>(); 
classMap.put("someClass", SomeClass.class)? 
// ... etc 
String someString = jsonObject.getString("someProperty"); 
Class classRef = classMap.get(someString); 
SomeSuperClass classInstance = new classRef(); 

這是行不通的。我寧願不要if/else下了很長的可能性列表。

+1

沒有Java的版本允許帶有字符串的切換語句(Java 7除外,但每個人都知道這只是一個讓我們保持安靜的神話)。 – Tharwen

回答

4

只需使用Class<?> clazz = Class.forName("com.yourpackage.YourClass")然後初始化它:clazz.newInstance();

+0

真棒,謝謝。我會在接受它時讓我(6分鐘) – momo

+0

這將返回Object類的引用,而不是Class類的引用。 –

+3

@Bhavik第一行Class.forName(「...」)返回一個類的引用。第二行實例化它並創建一個對象。 –

0

你使用地圖的方法是我會做什麼(你會看到它在工廠模式實現)。你只是沒有正確實例化這個類:

Class classRef = classMap.get(someString); 
SomeSuperClass classInstance = classRef.newInstance(); 
1

你也可以加載具有構造函數參數的類。

E.g.

public static void load(String p) 
    throws ClassNotFoundException, InstantiationException, 
    IllegalAccessException{ 
     Class cl = classLoader.loadClass(p); 
     Constructor c = cl.getConstructor(String.class); 
     Plugin plug = (Plugin) c.newInstance("myArgument"); 
    } 
+0

不應該返回創建的插件實例嗎? – Natix

+0

我們可以返回創建的'Plugin'實例,但我的意圖是顯示示例,您可以創建該對象的實例,儘管它具有帶參數的構造函數。 –

+0

@BhavikAmbani - 有趣的,謝謝 – momo

相關問題