Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Crear objeto del tipo que indica un String

Hola, espero alguien pueda ayudarme.

El punto es que tengo un String con un tipo de objeto, por ejemplo:
String cadena = "Integer";

y yo quiero crear un objeto del tipo que indica la cadena.
El caso es que quiero que el usuario escriba un tipo de objeto y muestre todos los métodos de ese objeto, esto se hace fácilmente, pero para tipos dados desde el código.
¿alguna idea?

octubre 8, 2013 | Registered Commenterdaniel04

Buenas,

Class.forName("java.lang." + cadena).getDeclaredFields();

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html


Un saludo

octubre 8, 2013 | Unregistered CommenterUnoPorAhi

Uf, eso fue rápido, muchas gracias, me has ayudado bastante.

octubre 8, 2013 | Registered Commenterdaniel04

@UnoPorAhi

Creo que querías decir getDeclaredMethods() en vez de getDeclaredFields()

octubre 8, 2013 | Registered Commenterchoces

@choces

Pues si, me equivoque haciendo el copy&paste :-)


Un saludo,

octubre 8, 2013 | Unregistered CommenterUnoPorAhi

Para no tener que saber de memoria la ruta de una clase del JDK, también puede hacerse así:

public class Test {

public static void main(String[] args) {
String prueba = "prueba";
Method[] declaredMethods = prueba.getClass().getDeclaredMethods();
for (Method metodo : declaredMethods) {
System.out.println("metodo: " + metodo.getName());
}
}
}

octubre 8, 2013 | Registered Commenterchoces

Yo creo que no. De esa forma estas listando siempre los metodos de la clase java.lang.String y no los de la clase referida en la cadena.


Un saludo

octubre 9, 2013 | Unregistered CommenterUnoPorAhi

La instancia prueba es de la clase String, luego tiene todos los métodos de la clase de la que es instancia.

octubre 9, 2013 | Registered Commenterchoces

Por dejarlo más claro, para el caso de que una clase extienda otra.

public class Test {

public static void main(String[] args) {

Clase1 prueba1 = new Clase1();
Method[] declaredMethods1 = prueba1.getClass().getDeclaredMethods();
for (Method metodo : declaredMethods1) {
System.out.println("metodos Clase1: " + metodo.getName());
}

Clase2 prueba2 = new Clase2();
Method[] declaredMethods2 = prueba2.getClass().getDeclaredMethods();
for (Method metodo : declaredMethods2) {
System.out.println("metodos Clase2: " + metodo.getName());
}
}

private static class Clase1 {

void metodoClase1() {
}
}

private static class Clase2 extends Clase1 {

void metodoClase2() {
}
}
}

La salida por consola es:

metodos Clase1: metodoClase1
metodos Clase2: metodoClase2

Puesto que getDeclaredMethods() devuelve los métodos declarados en la clase de referencia, no los de las super clases, si las hubiera.

Del Javadoc de getDeclaredMethods():
/**
* Returns an array of {@code Method} objects reflecting all the
* methods declared by the class or interface represented by this
* {@code Class} object. This includes public, protected, default
* (package) access, and private methods, but excludes inherited methods.
* The elements in the array returned are not sorted and are not in any
* particular order. This method returns an array of length 0 if the class
* or interface declares no methods, or if this {@code Class} object
* represents a primitive type, an array class, or void. The class
* initialization method {@code <clinit>} is not included in the
* returned array. If the class declares multiple public member methods
* with the same parameter types, they are all included in the returned
* array.

octubre 9, 2013 | Registered Commenterchoces

Ah!, te refieres a crear una instancia de la clase a examinar y luego hacerle el getClass()! Si, en ese caso si.
Lo único que veo en ese caso es que el codigo entonces debe ser estático y se pierde flexibilidad. Si, por ejemplo, queremos obtener dinámicamente la clase a examinar a partir de una tabla, un fichero, etc (que yo creo que, aunque no se especifica, es el caso que se plantea) no queda otra que hacerlo por el Class.forName

Un saludo

octubre 9, 2013 | Unregistered CommenterUnoPorAhi

Van apareciendo varias cuestiones recientemente, donde se confunde el identificador de una instancia de una clase, con una cadena de texto, que se puede utilizar tal cual, como texto.
En consecuencia, se quiere usar el identificador para lo que no está diseñado.

Del mensaje inicial: "...El caso es que quiero que el usuario escriba un tipo de objeto y muestre todos los métodos de ese objeto...".
¿Escribir, dónde?. ¿Un tipo de objeto?. ¿Se refiere a la clase o a la instancia?.

octubre 9, 2013 | Registered Commenterchoces