style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Ayuda: Ejecutar una clase pasandole como atributo el nombre de la misma desde una variable????

en una base de datos, tengo en una tabla los nombre de cada una de las clases de mi proyecto, lo que deseo es que al realizar una consulta a mi tabla de clases, el resultset que devuelve el nombre de la clase que deseo ejecutar, se ejecute.

Logre leer un post sobre reflexion, en donde creo una clase x y le asigno el nombre de mi variable y luego creando una instancia del objeto hacia una nueva instancia del mismo, pero tampoco entendi y no logre hacerlo.
====================================

Class class_tmp=Class.forName(nomb_class)
Object class_tmp=Object.newInstance();

====================================

Este es mi codigo en donde quiero ejecutar la clase cuyo nombre sea el que me devuelve el resultset.
=====================================================================================

conn=new conect("","","","");

try{
                        ResultSet rs = conn.dbSelect("SELECT nom_clase FROM sys_menu WHERE indice='"+ind+"");
                                if(rs.first()){

                                String nomb_class= rs.getString("nom_clase").toString();
                                 conn.CerrarConexion();

                             /// aqui deseo ejecutar la clase cuyo nombre sea (nomb_class)
                                 Ejemplo: new (nomb_class) ();

                                 this.dispose();       
                                }else{
                                        JOptionPane.showMessageDialog(this,"No se encontro el formulario deseado ");
                                        conn.CerrarConexion();
                                         }
                        }catch (Exception ex) {
                                        ex.printStackTrace();
                        }
                }

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Exacto, lo que tienes que

Exacto, lo que tienes que hacer es crear una instancia dinámicamente de la clase usando reflection, pero para "ejecutar" la clase tienes que llamar a un método del objeto.

Lo más fácil y que te recomiendo que hagas es que definas una interfaz y hagas que tus clases implementen esa interfaz para que llames un método que ya sabes que existe.

Un excelente candidato es la interfaz Runnable

Por ejemplo:

// LoadDemo.java
// compilar con : javac LoadDemo.java
// ejecutar con    java LoadDemo
// Utiliza java 1.7
Class clazz = Class.forName( className );
Runnable objeto = ( Runnable ) clazz.newInstance();
objeto.run();

Aquí va un ejemplo completo:

// LoadDemo.java
// Compilado usando Java 7
class Uno implements Runnable {
    public void run() {
        System.out.println("Uno corriendo");
    }
}
class Dos implements Runnable {
    public void run() {
        System.out.println("Dos corriendo");
    }
}
class LoadDemo {
    public static void main( String ... args ) {
        LoadDemo e = new LoadDemo();
        e.ejecutaClase();
    }
    public void ejecutaClase() {
        try {
            String nombreClase = this.obtenerDeBaseDatos();
            Class clazz = Class.forName( nombreClase );
            Runnable objeto = ( Runnable ) clazz.newInstance();
            objeto.run();
        } catch( ClassNotFoundException | InstantiationException | IllegalAccessException e ) {
            throw new RuntimeException("No pudo ejecutar la clase. Mensaje de error: " + e.getMessage() );
        }
    }
    public String obtenerDeBaseDatos() {
        // hace todo el JDBC blabalabl
        return "Uno";
    }
}

Espero que eso te de una buena idea.

Por cierto, unas recomendaciones:

- No concatenes strings en una consulta a la base de datos, utiliza PreparedStatements
- Cierra la conexión siembre en una clausula finally
- No hagas un catch de Exception porque te oculta errores de programación, si tienes que manejar varias excepciones hazlo como te muestro arriba, pero siempre sé específico.
- No uses guiones bajos en tus nombres como en String nom_clase aunque el código corre bien, es más por convención, es mejor escribir: String nomClass
- Los nombres de los métodos en Java van en minúscula por convención.

Y... ya .. :)

Espero que el ejemplo te sirva.

Reflection

Ok, esta chido tu ayuda jeje, bueno sobre el PreparedStatements lo manejo desde otra clase que es en donde tengo los metodos para hacer la conexion y las operaciones de base de datos, en mi metodo cerrar conexion esta integrado el finally, sobre el catch exception si tengo que cambiarlo por un SQL exception, solo que por comodidad le pude el exception jejeje, ok aun tengo mi duda sobre el reflection, la finalidad de mi codigo, es que al seleccionar un item menu, capturo el indice del menu y ese indice lo uso para realizar la consulta a la base de datos para que me de el nombre de la clase que pertenece a esa opcion, ejemplo, en mi menu tengo un menu administracion y sus respestivas opciones, crear usuario, actualizar usuario, eliminar usuario, agregar opciones de menu. Al seleccionar crear usuario obtengo el indice de esa opcion, que seria 1.1 y esa opcion me instancia una clase que se llama IgCrearUsuarios ( en la forma manual se ejecutaria asi: new IgCrearUsuarios( ); ) como logro hacer con reflection lo que hago con el new IgCrearUsuarios.

Intente adecuar tu ejemplo a mi codigo anterior, pero fracaso total, no me da error pero no me muestra esa ventana.

Saludos y gracias.

reflection en mi codigo

cree una clase para hacer una prueba:

public class CS_Reflections {

        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class _class = Class.forName("IgCrearUsuario");
        Object obj = _class.newInstance();

    }
}

pero da este error... estoy trabajano sobre eclipse, en el path tengo registrado ---> C:\Program Files (x86)\Java;C:\eclipse asi que no se a que se refiere que la clase no esta registrada en el classpath :-/

Exception in thread "main" java.lang.ClassNotFoundException: IgCrearUsuario
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at csytec.extras.CS_Reflections.main(CS_Reflections.java:6)

Imagen de ezamudio

paquete

Probablemente omitiste el nombre del paquete. Es como el apellido de la clase.

Listo, reflection soulcionado

Gracias a los compañeros que dedicaron tiempo de su tiempo para indicarme el camino y mas ilustrarme con ejemplos, ya logre hacer lo que queria, y efectivamente usando reflection, voy a leer mas sobre la api y sacarle provecho a su funcionalidad.

gracias a todos.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">