2012-03-22 18 views
12

Chcę utworzyć nową ClassLoader za każdym razem, gdy moja metoda zostanie wywołana.Utwórz nową klasę ClassLoader, aby ponownie załadować klasę

Dzięki temu mogę ponownie załadować class bez wychodzenia z programu.

Sposób, w jaki mogę zaktualizować class załadowany przez ClassLoader również byłby rozwiązaniem.

Jak mogę to osiągnąć?

+0

Załaduję skompilowaną klasę kodu JavaCompiler z loadClass ("ciąg"), a następnie uruchamiam tę klasę za pomocą JUnitCore. Następnie edytuję kod źródłowy w * .java, kompiluję go za pomocą JavaCompilera i chcę ponownie go załadować. – ctekk

+1

Interesujące pytanie na dobry użytek. +1 –

Odpowiedz

8

znalazłem dobrą odpowiedź wyjaśnione tutaj:

http://www.exampledepot.com/egs/java.lang/reloadclass.html

Ważną rzeczą jest, aby mieć dwa foldery binarnych, w moim przypadku: jeden dla testami i jeden dla źródła programu.

Cytat:

URL[] urls = null; 
try { 
    // Convert the file object to a URL 
    File dir = new File(System.getProperty("user.dir") 
     +File.separator+"dir"+File.separator); 
    URL url = dir.toURL();  // file:/c:/almanac1.4/examples/ 
    urls = new URL[]{url}; 
} catch (MalformedURLException e) { 
} 

try { 
    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class 
    Class cls = cl.loadClass("MyReloadableClassImpl"); 
+0

Wystarczy dodać - to rozwiązanie działa tylko wtedy, gdy przeładowana klasa nie ma żadnego usunięcia metody/odwołania do nowej klasy. Problem z tym podejściem polega na tym, że jeśli ktoś wpadnie na pierwsze, aby dodać klasy zależne, może to spowodować NoClassDefFoundError. Najlepiej ponownie załadować wszystkie klasy bez całkowitego zatrzymania aplikacji. – ha9u63ar

Powiązane problemy