Hola! estoy haciendo una aplicacion que sea cliente de una base de datos la filtre y mas cosas...
Cada categoria o subcatecoria pone en una posicion de un combobox una palabra (el combobox es para seleccionar que lo que voy a crear forma parte de esa clase), por esto, y alguna cosa mas, querria evitar tener que modificar el codigo cada vez que añado una clase, en este caso tendria que modificar el metodo que rellene el combobox para decirle que tambien incluya la clase nueva.
La solucion que he encontrado y estoy desarrollando poco a poco para poder hacer esto de forma facil (facil para mantener la base de datos, no para crear el codigo de esta aplicacion, que me parece que con esto la estoy complicando mucho e incluso va a ser lenta, por lo menos al cargar al principio...) es la siguiente:
-obtengo los nombres de los ficheros de un directorio (parto del package principal donde estan los componentes (todas las clases que almacenan componentes de la base de datos) y si hay mas packages subo a ellos para leerlos tambien) y filtro los '.java' quitandoles la extension.
Código:
File fichero; //=new File("Readfile.java");
fichero=new File(directory);
String[] listaArchivos=fichero.list(); //crea un array cn los nombres de los ficheros en el directorio.
listaArchivos=fichero.list(new Filtro(".java")); //filtra los archivos dejando solo los que tienen extension '.java'
for(int i=0; i<listaArchivos.length; i++) //elimina la extension de el nombre del archivo
{
//System.out.println(listaArchivos[i]);
listaArchivos[i]=listaArchivos[i].substring(listaArchivos[i].lastIndexOf('/') + 1, listaArchivos[i].lastIndexOf('.'));
//System.out.println(listaArchivos[i].substring(listaArchivos[i].lastIndexOf('/') + 1, listaArchivos[i].lastIndexOf('.')));
}
-
-creo una clase equivalente a la clase que tiene el mismo nombre del archivo
Código:
ClassLoader classLoader = Componente.class.getClassLoader();
Class aClass = null;
try {
aClass= classLoader.loadClass("componentespkg.cat2."+classnamber);
}
-Instancio esa clase cast-andola (xd) con la clase que quiero comparar y ejecuto el metodo que me interesa, que es, por ejemplo el String que esa clase mandara al combobox.
El programa de momento lee los archivos en un directorio, los filtra y compara con instanceof con la clase padre o con las subclases, pero todavia tengo que darle yo demasiados datos...
Funciona, pero yo no quiero tener que saber la clase de antemano para hacer cast.
Probando si en cada metodo pongo
solo, sin modificador ni nada (que no se para que sirve), podria obtener variables escribiendo que llame a una funcion de la clase principal y le de como parametro algo, pero el problema de eso es que solo es una funcion/metodo(?), entonces si quisiera obtener informacion ordenada de esa clase tendria que enviarla toda de golpe a la clase principal y alli ordenarla... vamos, que no ganaria mucho teniendo que crear un indice de quien me envia cada cosa y que cosa es...
Otro modo de hacer algo parecido seria con reflexion (bueno, lo tro tambien se vale de ella xd), seria leer las clases de un directorio y cargarlas en tiempo de ejecucion, el problema es que no se como podria acceder a sus metodos (si es que se puede).
Es decir: yo leo un directorio y cargo una de las clases, la clase 'abc' (el archivo se llama 'abc.java' y tiene los metodos a, b y c), que ahora esta e una clase generica Class x, por ejemplo. Como puedo acceder a los metodos 'a', 'b', 'c'? Yo se que la clase, en cuanto que se cargue (en tiempo de ejecucion) sera 'abc' y tendra el metodo 'a' al que podre llamar, pero el compilador no lo sabe.
En resumen, yo tengo una carpeta con las clases que sé, porque heredan de una clase principal que lo tiene, que tienen un metodo determinado 'metodo1', lo demas no lo se, pero ese si.
¿Como voy llamando a todos los metodos 'metodo1' de las clases que desconozco cuales son?
¿Como podria hacerlo?
Perdonar por la extension, pero no sabia como explicarlo brevemente xd.
Un saludo.