Externe Java Klasen zur Laufzeit einbinden

Diskutiere Externe Java Klasen zur Laufzeit einbinden im Allgemeine Java-Themen Bereich.
Bitte aktiviere JavaScript!
Tashtego

Tashtego

Hallo.

Ich möchte einen Prototpyen schreiben. In diesem möchte ich Klassen einer externen JAR-Datei "nachladen", Object dieser Klasse instanzieren und mit Werten befüllen. Das ganze wird evtl noch erschwert, weil es jetzt das Modulsystem von Java 9 gibt. Über ein zwei Tips oder Links würd ich mich freuen. Ihr müßt mir das nicht runtercoden, ich könnt nur Starthilfe brauchen.

Danke!
 
Tashtego

Tashtego

Der Einfachheit halber nehme ich an, daß das einzubindende Modul seine Packages alle exportiert.
 
Tashtego

Tashtego

Der erste Versuch, der noch nicht klappt bisher...

DynamicClassLoader dynamicClassLoader = (DynamicClassLoader) ClassLoader.getSystemClassLoader();
File file = new File("/path/to/my/classfiles");
URL externalPath = file.toURI().toURL();
dynamicClassLoader.add(externalPath);

Class clazz = dynamicClassLoader.loadClass("com.external.ExternalClass");
Object o = clazz.getDeclaredConstructor().newInstance();
 
Zuletzt bearbeitet:
Tashtego

Tashtego

ClassNotFoundException :(

Brauche Mal mehr Grundlagen als nur ausprobieren. Wer beschäftigt sich schon mit Classloadern...
 
Tashtego

Tashtego

Hm eventuell war es auch die NoClassDef. Bin Grad nicht am PC aber eine der beiden exceptions wars.
 
Tashtego

Tashtego

Hm ok also ich hab jetzt ein laufendes Beispiel hinbekommen. Zum einen muß man den CustomClassLoader via jvm Paramter angeben:

-Djava.system.class.loader=com.test2.DynamicClassLoader

Die Grundlage hierfür hat die folgende Klasse gebildet:

https://github.com/update4j/update4j/blob/master/src/main/java/org/update4j/DynamicClassLoader.java

Zum anderen hab ich die Methode appendToClassPathForInstrumentation dort von private auf public gestellt und dann einen Pfad zum externen JAR angegeben.

Also GEHEN tut es. ABER ich möcht den Mist irgendwie auch verstehen. Hab mal baeldung überflogen. Aber ein deutscher Artikel zum Thema Classloading oder Instrumentation (was wohl neuer ist als Classloading?) wär cool... Ich hab nen Prototyp der geht, aber kein Verständnis, was mich stört ;(


update:
hm https://jaxenter.de/james-bond-laesst-gruessen-28256
Instrumentieren klingt eher nach Bytecode Manipulation zur Laufzeit. Ich wollte nur nen Jar hinzufügen.
 
Tashtego

Tashtego

Ich denke fast, ich kann das ohne nen CustomClassloader nur mit URLClassLoader hinbekommen. Das teste ich gerade.
 
Tashtego

Tashtego

ok zu kompliziert gedacht. wenn man also externe jars laden will, geht das wirklich einfach über den url class loader

URL[] urls = new URL[1];
URL url = new URL("file:/home/xyz/xyz/external.jar");
urls[0] = url;
URLClassLoader loader = new URLClassLoader(urls);
Class clazz = loader.loadClass("com.external.ExternalClass");
Object o = clazz.getDeclaredConstructor().newInstance();
 
mihe7

mihe7

Ja, wenn Du nicht den System-ClassLoader ersetzen willst, ist das kein Problem. Sonst gilt:

"If a custom system class loader is configured (by means of the system property java.system.class.loader as specified in thegetSystemClassLoader method) then it must define the appendToClassPathForInstrumentation method as specified inappendToSystemClassLoaderSearch. In other words, a custom system class loader must support the mechanism to add an agent JAR file to the system class loader search." (s. Loading agent classes and the modules/classes available to the agent class in https://docs.oracle.com/javase/9/docs/api/java/lang/instrument/package-summary.html)
 
Thema: 

Externe Java Klasen zur Laufzeit einbinden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben