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

Aportación JavaMéxico - PCJ - Reflexión en Java I, Instancia una clase desconocidas en tiempo de ejecución

La Reflexión es el mecanismo mediante el cual java puede conocer clases ya compiladas y nos permite conocer cualquier clase con tan solo conocer su nombre así como crear instancia de los objetos e interactuar con los métodos de la misma, este puede tener diversas aplicaciones, en un siguiente post les mostrare como aprovecho esta ventaja en la programación en Web de Java por ahora me limito a mostrar algo de la API, en este post solo mostrare como crear la instancia de un objeto en post posteriores mostrare como obtener información de la clase y interactuar con sus métodos.
Para poder instanciar una clase con solo conocer su nombre y o ubicación en el classpath, ojo la clase tiene que estar en el claspath algo lógico por que si no lo esta java no la encontrará.

Para Ejemplificar creare dos clase A y B:

Class A

public class A {    
    @Override
    public String toString() {
        return "Esto es una clase A";
    }
}

Class B

public class B {
    @Override
    public String toString() {
        return "esto es una B";
    }

}

Como observara solo he definido el método toString() que sobrescribe el método heredado desde java.lang.Object, este método se invoca al tratar de convertir un objeto a String por ejemplo al querer imprimirlo con un System.out.println()
Para Obtener la clase desde un string haremos uso del método estático forName() de la clase Class, esta clase nos provee distintos métodos para obtener información de una clase, si han manejado drivers jdbc recordaran haber utilizado este método.
Ejemplo :

Class _class = Class.forName(“A”);

Con esto se almacena la clase (el molde, no la instancia) de la clase A, observe que se envía una cadena esto hace que esto pueda ser dinámico en tiempo de ejecución ya que podemos tener una variable y esta enviarla al Class.forName, si la clase no se encuentra se genera una excepción tipo ClassNotFoundException .
Una ves que tenemos la clase podremos llamar a su constructor por defecto (el que no recibe ningún parámetro, constructores con parámetros los mostrare en otro post)

Para crear la instancia haremos uso del método .newInstance(); del objeto Class que almacene nuestra clase en nuestro ejemplo _class, este métodos pueden generar excepciones tipo InstantiationException, IllegalAccessException

Object obj=_class.newInstance();

Las excepciones las podemos manejar con campos try/catch o bien agregando throws al inicio de nuestro método.
Para ver que realmente estamos instanciando un objeto del tipo marcado en Class.forName, mandare imprimir el objeto.

System.out.println(obj);

Con esto mando implícitamente el método .toString(), podrán observar la salida en la consola y debería de mostrar el mensaje:

“Esto es una clase A”

Aquí el código de la clase que usa la reflexión
reflexion1.java

public class refexion1 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class _class = Class.forName("A");
        Object obj = _class.newInstance();
        System.out.println(obj);

    }
}

Ahora cambie el parámetro de Class.forName a “B”, y pruebe observara que el mensaje ha cambiando por

“esto es una B”

Por último modifico la clase para que atreves del teclado el usuario me indique que clase instanciar.

import java.util.Scanner;
public class refexion1 {
    public static void main(String[] args) {
        System.out.println("Escribe A o B");
        String strClase = new Scanner(System.in).nextLine();
        try {
            Class _class = Class.forName(strClase.toUpperCase());
            Object obj;
            try {
                obj = _class.newInstance();
                System.out.println(obj);
            } catch (InstantiationException ex) {
                System.out.println("Error al Instaciar laClase");
            } catch (IllegalAccessException ex) {
                System.out.println("Error al Instaciar laClase");
            }
        } catch (ClassNotFoundException ex) {
            System.out.println("La Clase No existe");
        }
    }
}

Espero este post allá despertado su interés.. próximamente les digo como obtener información, instanciar con constructores con parámetros, obtener información de los métodos y sus parámetros y como interactuar con ellos.

Código fuente en proyecto de netBeans 6.8 http://www.megaupload.com/?d=NU41A5D0

>> Reflexión en Java II, Obtener propiedades de una clase desconocidas en tiempo de ejecución
>> Reflexión en Java III, Acceso y modificación de propiedades

Post: http://www.devtics.com.mx/wp/index.php/319-reflexion-en-java-i-instancia...

PD:espero que la continuación de este post sea considerado como parte del mismo ya que es el mismo aporte, sol que por tiempo y por que creo que es mejor ir mostrando poco a poco decidir continuar con el modo de entregas continuas el post y no modificar este primer post, también omitir el comentario "Aportación JavaMéxico - PCJ" en los próximos post pero todos ellos forma parte de esta aporte.

Comentarios

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.
Imagen de ezamudio

PCJ

Estas aportaciones a temas muy básicos de Java me parecen valiosas para poderlas tener como referencia para gente que está aprendiendo el lenguaje y conceptos de OOP.

Para la evaluación de PCJ solamente pudimos tomar en cuenta las partes I y II, ya que la III fue publicada hoy (19/abr) y la fecha límite era anoche.

Imagen de fcodiaz

no problem

No hay problem de hecho yo creo me faltan unas 5 partes mas para terminar de exponer reflexión aun me falta acceso a metodos, ejecutar los metodos, parámetros de métodos, instancia con constructores con parámetros, y luego el caso de uso que al final también creo me llevara un par de post por lo que tengo material para compartir un buen rato..

HELP ME PLEASE

Amigo tengo una pregunta mm aver si me ayudan un poco tengo una clase:

public class grid_marca{

public static DefaultTableModel cont_table;

public static JPanel grid_marca(){
//aqui el cuerpo de la tabla
cont_table………………
}
}
................................................................................................................................................................................................................
luego tengo una segunda clase:

public class Grid {
public void grid(){

grid_marca objeto=new grid_marca()
bjeto.cont_table.addRow(fila);

}
}

lo que quiero es que el “grid_marca” sea dinamico(por ejemplo quiero poner grid_venta u otro) y pueda agregar los datos a la tabla de esta segunda clase.

Bueno tengo entendido que con REFLEXION se puede lograr eso peroooo nose como hacerlo,ya tengo unos dias en esto.

Le agradeciria mucho su respuesta.

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