2010-07-04 24 views
7

Dostałem kod Java-bajt (tak skompilowane źródło java), który jest generowany w moim programie. Teraz chcę załadować ten kod bajtu do aktualnie uruchomionej maszyny wirtualnej Java i uruchomić określoną funkcję. Nie jestem pewien, jak to osiągnąć, trochę wczepiłem się w Java Classloaders, ale nie znalazłem prostego sposobu.Załaduj kod bajtów Java w środowisku wykonawczym

Znalazłem rozwiązanie, które pobiera plik klasy na dysku twardym, ale kod bajtowy, który dostałem, znajduje się w tablicy Byte-Array i nie chcę zapisywać go na dysku, ale użyć go bezpośrednio.

Dzięki!

+0

myślę pod tym linkiem powinny znaleźć to, czego szukasz: http: //tutorials.jenkov. com/java-reflection/dynamic-class-loading-reloading.html Zobacz ostatnią sekcję "Przykład ładowania/ponownego ładowania ClassLoader". –

+0

Moje pytanie było niejasne: nie mam pliku klasy, ale tablicy bajtów i chcę załadować go bezpośrednio. Dzięki i tak! – theomega

+0

Jestem przekonany, że mój link dokładnie to potwierdził. Przynajmniej znalazłem to przez to: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#defineClass (byte [], int, int) Możesz także oczywiście zawsze zapisuj tablicę bajtów w katalogu tymczasowym. –

Odpowiedz

9

trzeba napisać niestandardowy klasy ładowarka że przeciąża metodę findClass

public Class findClass(String name) { 
    byte[] b = ... // get the bytes from wherever they are generated 
    return defineClass(name, b, 0, b.length); 
} 
+0

Dzięki, brzmi jak sposób, ale nie ma bezpośredniej drogi bez pisania custon ClassLoader? – theomega

+0

przynajmniej nie znalazłem do tej pory –

+0

Działa bardzo dobrze, dzięki! – theomega

2

Jeśli kodu bajtowego nie ma w ścieżce klas uruchomionego programu, można użyć parametru URLClassLoader. Od http://www.exampledepot.com/egs/java.lang/LoadClass.html

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

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

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+0

Moje pytanie było niejasne: nie mam pliku klasy, ale tablicy bajtów i chcę go załadować bezpośrednio. Dzięki i tak! – theomega

+0

Możesz edytować swoje pytanie, aby było bardziej precyzyjne. Cytowany kod działa z plikami klas ón na dysku twardym. –

Powiązane problemy