Crear objetos a partir de una cadena recibida

Tengo una aplicación java, en la que recibo una cadena con el nombre de una clase, a partir de ese nombre yo tengo que crear un objeto de esa clase. No puedo poner if() para comparar la cadena con cada una de las clases( puesto que son demasiadas). Mi pregunta es... ¿existe alguna posibilidad de declarar un objeto a partir de una cadena recibida? Investigando llegué a Class. Forname(), pero después me di cuenta, que esta solo proporciona información sobre el .class de una clase o los métodos que posee ( vamos eso creo...)

1 respuesta

Respuesta
1
Creo que no he entendido muy bien tu pregunta... pero intentaré contestarte, si no es esto lo que me pides ya sabes, aquí estoy :)
Te lo explicaré como me lo explicaron a mi. Todo es cuestión de herencia, tu no puedes convertir un objeto naranja en un objeto limón, porque son objetos diferentes, pero sí puedes convertir una naranja o un limón en un objeto cítrico, porque ambos son cítricos. Esta teoría básica de orientación a objetos que supongo que te habrán contado alguna vez (mis tutores eran bastante... curiosos :p) la tienes que aplicar también a tu problema.
No podrás convertir un objeto de clase A en otro de clase B si no están interrelaccionados. Se pueden relacionar bien porque A extienda B, o bien porque A implemente B. Con tu problema es lo mismo :) Ahora, hasta donde yo entiendo tu duda... la cosa es que una cadena de texto te da el nombre de la clase en la que quieres convertir un objeto. Como sabes, el casting se hace:
ObjetoB miobjetoB = (ObjetoB) miobjetoA;
Bien, creo que por lo que preguntas se llama "dynamic casting" y hasta donde yo se Java no lo permite. No estoy muy seguro de si está soportado por la JRE 1.5, pero las anteriores sé que no lo soportan. Lo que se hace para estos casos es dividir el casting en todas las posibles opciones que sepas que pueden ocurrir, y ejecutarlo tal cual. Imaginate:
if ( nombre_de_la_clase.equals ( "String" ) )
{
MiObjeto mi_objeto = (String) otro_objeto;
}
else if ( nombre_de_la_clase.equals ( "Integer" ) )
{
MiObjeto mi_objeto = (Integer) otro_objeto;
}
....{
}
else
{
throw MiPropiaException ( "Class " + nombre_de_la_clase + " unknown" );
}
Todo ello incluido dentro de un try/catch por si se lanza una excepción del tipo ClassCastException.
Como digo, si no es esto lo que me pedías ya sabes donde encontrarme :)
Muchas gracias me ha servido de mucho, tu comentario, pero ahora me ha surgido un nuevo problemilla muy parecido a este y si me pudieses ayudar te lo agradecería. Me encuentro ahora la situación de que igualmente que cree un objeto de un tipo especificado por una cadena, tengo que hacer una conversión cast de otro objeto a partir de esta cadena. Es decir:
Miobjeto = (cadena_con_el_tipo)ObjdeOtrotipo;
Es esto posible, ¿igualmente? ¿Se utilizaría la misma clase?
Gracias de antemano
Un Saludo de un agradecido :)
Sí que existe esto que dices, se llama "reflexión" y es bastante utilizado actualmente para todo el tema de servicios web y cosas por el estilo. Como dices tienes que utilizar la clase Class y el método forName(), y posiblemente tengas que utilizar las clases Object, Method, y Constructor, todos del paquete java. Lang. Reflect
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/package-summary.html
El poder de esto es increíble. Utilizando el nombre de una clase puedes crear un objeto Class de esa clase:
Class miclase = Class.forName ("ObjetoMiClase");
Con ese objeto Class puedes crear un nuevo objeto de esa clase de varias maneras. Si ese objeto tiene un constructor por defecto puedes Crear el objeto como:
ObjetoMiClase miobjeto = (ObjetoMiClase) miclase.newInstance ( );
Si la clase tiene varios constructores puedes obtener la lista de constructores con
Miclase. GetDeclaredConstructors ( )
Y con esos objetos javal. Lang. Reflect. Constructor puedes instanciar un nuevo objeto de esa clase con los parámetros determinados de cada constructor (que podrás leer y rellenar sin problemas utilizando los métodos de la clase Constructor).
O incluso si implementa algún interfaz, también puedes saberlo... en definitiva, puedes hacer de todo ;) Esto te permite generar objetos nuevos en tiempo de ejecución, y también te permite compilar código nuevo en tiempo de ejecución! Es decir, puedes tener una clase que genere código Java para otras clases según lo que necesites, y con esos nuevos ficheros fuente generados en tiempo de ejecución puedes llamar al compilador de Java para compilar y generar objetos a partir de ellas... increíble ;)
En fin, mira lo que dice el API para los objetos Class, y el API para el paquete java. Lang. Reflect, y ahí tienes toda la información que necesitas :)
Si necesitas más ayuda no dudes en contactar conmigo.
No te preocupes, pregunta lo que quieras :) Sí puedes compilar en tiempo de ejecución código que generes en tiempo de ejecución (o cualquier código). La clase java. Lang. Compiler, que tiene todos sus métodos estáticos, te permite hacer esto. Pero ten cuidado como lo usas, porque puede ser fuente de muchos problemas :)
http://java.sun.com/j2se/1.3/docs/api/java/lang/Compiler.html
Te comenté sobre esto en mi primera respuesta. Ahí te expliqué por encima un poco de todo esto. Una vez que compiles tu clase será útil que utilices los objetos del paquete java. Lang. Reflect
http://java.sun.com/j2se/1.3/docs/api/java/lang/reflect/package-summary.html
Hola, espero no ser muy pesado, es que estoy buscando maneras de solucionar mi problema, y se me ha ocurrido otra idea, pero tampoco se si puede hacer en java.
Se puede desde una aplicación en tiempo de ejecución, ¿escribir código java en un fichero y compilarlo?
Esto lo realizaría para que, a partir de la cadena que me pasases el usuario poder escribir en un fichero java que luego compilario el cast que yo quiero.
NO se si se entiende lo que quiero decir.
Muchas Gracias, me estas ayudando
Saludos
No olvides puntuar y finalizar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas