在我的具體情況下,我想在運行時加載一個類,其中:我有編譯時的類(及其定義),但我只找到位置它在運行時包含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", ...);
這是真的可以沒有反射嗎?我可以在編譯時瞭解這個類的好處嗎?或者我必須像上面一樣使用反射。
謝謝。