Ciao a tutti e grazie per l'attenzione! Ho un problema che deve essere sia facile che ovvio, eppure sono bloccato.Come utilizzare ClassLoader personalizzato?
Desidero consegnare classi Java create dinamicamente per essere utilizzate da una libreria di terze parti tramite un ClassLoader personalizzato.
Ora il mio problema è: come posso impostare il mio ClassLoader personalizzato da utilizzare per caricare le classi quando non li carico direttamente da solo?
Ho pensato che quando ho usato il mio ClassLoader per caricare una determinata classe, è diventato ClassLoader di questa classe e tutte le classi caricate da quella classe sarebbero state canalizzate attraverso il mio ClassLoader.
Ho creato un ClassLoader personalizzato, seguendo questo tutorial ufficiale: http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html.
public class DynamicClassloader extends ClassLoader {
private Map<String, Class<?>> classesMap = new HashMap<String, Class<?>>();
public DynamicClassloader(ClassLoader parent) {
// Also tried super(parent);
super(sun.misc.Launcher.getLauncher().getClassLoader());
}
// Adding dynamically created classes
public void defineClass(String name, Class<?> clazz) {
classesMap.put(name, clazz);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// load from parent
Class<?> result = findLoadedClass(name);
if (result != null) {
return result;
}
try {
result = findSystemClass(name);
} catch (Exception e) {
// Ignore these
}
if (result != null) {
return result;
}
result = classesMap.get(name);
if (result == null) {
throw new ClassNotFoundException(name);
}
return result;
}
}
ho voluto usare questo da qualche altra parte nel codice del genere:
ClassLoader thisClassLoader = this.getClass().getClassLoader();
((DynamicClassloader) thisClassLoader).defineClass(className, dynClass);
Ora il mio problema è che quando chiamo findSystemClass(name)
del 3 ° Class Library partito, il ClassLoader genitore trova questa classe (perché si trova sul classpath) e diventa ClassLoader. E poiché il genitore ClassLoader non conosce il mio ClassLoader personalizzato, è stato effettivamente messo fuori uso e non è possibile trasmettere this.getClass().getClassLoader()
a DynamicClassLoader.
Un altro approccio sarebbe quello di impostare ClassLoader come sistema ClassLoader tramite l'argomento JVM -Djava.system.class.loader=my.DynamicClassloader
. Ma che mi dà uno StackOverflowError:
...
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.findSystemClass(ClassLoader.java:916)
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
...
Questo deve essere davvero facile da fare, ma ora sono a corto di idee ... qualsiasi aiuto è molto apprezzato!
correlati a http://stackoverflow.com/questions/6366288/how-to-change-default-class-loader-in-java, http://stackoverflow.com/questions/5380275/replacement-system-classloader-for-classes-in-jars-contain-jars/19128964 # 191 28964 e http: // StackOverflow.com/domande/5380275/sostituzione-system-classloader-per-corsi-in-barattoli contenenti-giare. – roesslerj