Juego con Reflection y pensé en hacer algo que cargue una clase e imprima los nombres de todos los campos de la clase. he hecho un pequeño hola mundo tipo de distinción a tener algo para inspeccionar:Cómo usar URLClassLoader para cargar un archivo * .class?
[email protected]:~/eclipsews/SmallExample/bin$ ls
IndependentClass.class
[email protected]:~/eclipsews/SmallExample/bin$ java IndependentClass
Hello! Goodbye!
[email protected]:~/eclipsews/SmallExample/bin$ pwd
/home/kent/eclipsews/SmallExample/bin
[email protected]:~/eclipsews/SmallExample/bin$
base en lo anterior saco dos conclusiones:
- Existe en/home/Kent/eclipsews/SmallExample/bin/IndependentClass.class
- ¡Funciona! (Por lo tanto, debe ser un .class-archivo adecuado que puede ser cargado por un cargador de clases)
continuación, el código que se va a utilizar la reflexión: (Línea que provoca una excepción está marcado)
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class InspectClass {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws ClassNotFoundException, MalformedURLException {
URL classUrl;
classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class");
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);
Class c = ucl.loadClass("IndependentClass"); // LINE 14
for(Field f: c.getDeclaredFields()) {
System.out.println("Field name" + f.getName());
}
}
}
Pero cuando lo ejecuto me sale:
Exception in thread "main" java.lang.ClassNotFoundException: IndependentClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at InspectClass.main(InspectClass.java:14)
Mis preguntas:
- ¿Qué estoy haciendo mal ¿encima? ¿Cómo lo arreglo?
- ¿Hay alguna forma de cargar varios archivos de clase e iterar sobre ellos?
advertencias Qué estás suprimiendo? –
Un error común es usar el directorio actual como URL, pero también usar el directorio actual para sus clases normales. Debido a que el elemento primario predeterminado es el cargador de clases del sistema, su cargador de clases no tiene la oportunidad de cargar la clase. –
archivo: ///home/kent/eclipsews/SmallExample/bins/IndependentClass.class que debe ser: archivo: ///home/kent/eclipsews/SmallExample/bin/IndependentClass.class? – dfa