tutorial - java classloader example
¿Cómo poner ClassLoader personalizado para usar? (1)
No estoy seguro de entender la pregunta, tiene una biblioteca de terceros y desea que use su cargador de clases para cargar clases.
Si tiene suerte, la Thread.currentThread().setContextClassLoader(myClassLoader)
terceros utiliza el subprocesador de clase de contexto de subprocesos que puede configurar mediante Thread.currentThread().setContextClassLoader(myClassLoader)
, en el mismo subproceso puede acceder a este cargador de clases con Thread.currentThread().getContextClassLoader()
. ..
Otro punto, pero no está seguro de que sea importante en su contexto, es que también puede escribir un último cargador de clases padre que intentará cargar la clase antes de delegar a su padre (en lugar de intentar delegar primero)
Editado después de tu comentario:
parent_last classloader marcará la diferencia si su biblioteca no se basa en el contexto de subprocesos classloader, entonces tiene que cargar la biblioteca con su último cargador de clases principal, configurando así su classloader como el cargador de clases para la biblioteca en lugar de su cargador primario (el principal de su cargador de clases) ...
También puede crear un cargador de clases con un comportamiento de primer padre, pero para su biblioteca de terceros ...
Hola a todos y gracias por la atención! Tengo un problema que debe ser fácil y obvio, pero estoy atascado.
Quiero entregar clases de Java creadas dinámicamente para ser utilizadas por una biblioteca de terceros a través de un ClassLoader personalizado.
Ahora mi problema es: ¿Cómo configuro mi ClassLoader personalizado para que se use para cargar estas clases cuando no las cargo directamente yo mismo?
Pensé que cuando usaba mi ClassLoader para cargar una determinada clase, se convertía en el ClassLoader de esta clase, y todas las clases cargadas de esa clase se canalizarían a través de mi ClassLoader.
Creé un ClassLoader personalizado, siguiendo este tutorial oficial: 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;
}
}
Quería usar esto en otro lugar en el código así:
ClassLoader thisClassLoader = this.getClass().getClassLoader();
((DynamicClassloader) thisClassLoader).defineClass(className, dynClass);
Ahora mi problema es que cuando llamo a findSystemClass(name)
de la clase de biblioteca de terceros, el ClassLoader principal encuentra esta clase (porque está en el classpath) y se convierte en su ClassLoader. Y como el ClassLoader principal no sabe acerca de mi ClassLoader personalizado, efectivamente se ha dejado de usar y this.getClass().getClassLoader()
no se puede convertir en DynamicClassLoader.
Otro enfoque sería configurar mi ClassLoader para que sea el sistema ClassLoader a través del argumento JVM -Djava.system.class.loader=my.DynamicClassloader
. Pero eso me da un 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)
...
Esto debe ser realmente fácil de hacer, sin embargo, ahora estoy sin ideas ... ¡cualquier ayuda es muy apreciada!