2011-08-28 104 views
3

我想動態加載實現接口的具體類。輸入:具體類名稱。使用Java加載動態類

我需要調用這個具體類的方法,那就是,我需要設置:

MyInterface myclass = new concreteClassName(); 
myclass.function(); 

我怎樣才能做到這一點?

+1

請注意'class'是一個java關鍵詞,並且您無法命名您的變量類 – amit

+0

您的動態加載意味着什麼? – umbr

+0

@amil:我現在編輯它,它只是一個例子 – Shakes

回答

6

看看Class.forName(String)

String str = "Test$B"; //your full class name here instead of Test$B 
    A clazz = null; //change A to be your interface 
    try { 
    clazz = (A)Class.forName(str).newInstance(); //change A to be your interface 

    } catch (Exception e) { 
     //TODO: handle exceptions 
     e.printStackTrace(); 
    } 
    if (clazz != null) { 
     clazz.foo(); 
    } 
4

您檢查了

try { 
    // Load class 
    Class<?> cls = Class.forName("my.package.ConcreteClass"); 

    // Instantiate object from class using default constructor 
    my.package.ConcreteClass obj = (my.package.ConcreteClass) cls.newInstance(); 

    // Execute method on it 
    obj.myMethod(); 
} catch (Exception e) { 
    throw new RuntimeException("Could not instantiate class", e); 
} 

和相應的javadoc條目Class#forNameClass#newInstance

+0

但我想通過界面調用我的類而不是直接調用my.package.ConcreteClass – Shakes

+0

等待任何答覆? – Shakes

0

你應該實現你自己的ClassLoader

+0

這將是我的最後一個選擇,但我認爲有一個更簡單的解決方案 – Shakes

+0

切實可行,您可能會發現(通過谷歌:)已有的庫與該功能 – umbr