2015-02-11 99 views
0

在我的具體情況下,我想在運行時加載一個類,其中:我有編譯時的類(及其定義),但我只找到位置它在運行時包含jar。與典型的類加載情況有所不同,其中該類的名稱僅在運行時才知道。動態加載一個沒有反射的預編譯類

假設要加載的類是組織/動物/ Cat.class,它是在animals.jar一類了許多。當我編譯我的程序,animals.jar是我編譯時的類路徑,因爲我知道它在哪裏,例如: javac -cp <path to>/animals.jar Something.java

我可以進口,引用它,並編譯我的程序Something.java

import org.animals.Cat; 

    ... 
    Cat c = new Cat(); 
    c.makesound(); 

現在我將程序部署到生產系統,其中animals.jar和其他庫的位置僅在運行時已知。如果我知道位置,我可以使用

java -cp <path to>/animals.jar Something 

但是我只是在運行時才發現它。我希望我可以使用URLClassLoader使其工作。假設到下的jar「位置」存儲運行時路徑傳遞的,我可以創建加載它的類加載器:

URL url = new File(location + "/animals.jar").toURI().toURL(); 
URL[] urls = new URL[]{url}; 
URLClassLoader cLoader = new URLClassLoader(urls); 

,然後只用在我的程序目錄,如編譯,而不必訴諸 反射。例如,這是我試圖避免的:

Class clazz = cLoader.loadClass("org.animals.Cat") 
Object o = clazz.newInstance(); 
Method m = o.getClass().getMethod("makesound", ...); 

這是真的可以沒有反射嗎?我可以在編譯時瞭解這個類的好處嗎?或者我必須像上面一樣使用反射。

謝謝。

回答

1

如果您Cat類是已知的實現,比如,一些Animal接口,那麼你可以做Animal a = (Animal)o,並開始在調用aAnimal方法沒有任何使用反射。