2011-01-14 10 views
5

Me preguntaba si es posible declarar un nuevo objeto de algún tipo en Java, dado que tengo ese tipo representado como un objeto de clase.Declaración de objeto Java dado su nombre de tipo/clase como cadena

Por ejemplo, digamos que tengo

SomeClass obj1; 
Class c = obj1.getClass(); 

Ahora me gustaría tener "c" y utilizarla para declarar un nuevo objeto de ese tipo. Algo a lo largo de estas líneas:

Class<c> my_new_var; 

tal que my_new_var sería entonces una variable del mismo tipo/clase como obj1. Esto está directamente relacionado, supongo, con si podemos usar un objeto de clase (o algo relacionado con ese objeto de clase) como tipo en la declaración de una nueva variable.

¿Es eso posible o imposible debido a que Java tiene un tipado fuerte?

Gracias de antemano,

Bruno

+0

Tal engaño dinámica es incluso desalienta en los lenguajes dinámicos. ¿Por qué crees que esta es una buena idea? – delnan

Respuesta

2
YourType newObject = c.newInstance(); 

Pero es necesario tener un constructor sin argumentos. De lo contrario, tendrías que hacer más reflexión.

Tenga en cuenta que no hay necesidad de transmitir si su Class está parametrizado. Si no es así, como en tu código, necesitarías un elenco.

A su segunda pregunta: no, no es posible declarar una variable de tipo dinámico, porque sí, Java está tipada estáticamente. Debe definir el tipo de una variable en el momento de la compilación. En el ejemplo anterior se puede:

  • uso Object, si no se conoce el tipo, porque es la superclase de todos los objetos.
  • usan genéricos. Por ejemplo (con el manejo de excepciones omitido):

    public static <T> T createNewInstance(T exampleInstance) { 
        return (T) exampleInstance.getClass().newInstance(); 
    } 
    
+2

Siempre que su clase tenga un constructor público sin parámetros. – biziclop

+0

Gracias Bozho. Entiendo que c.newInstance() me daría un nuevo objeto del mismo tipo que obj1; el problema es que al declarar newObject, aún necesitaría declararlo como "YourType", que supongo que no sé, excepto a través de "c". Idealmente, encontraría que algo como la clase se puede usar como un tipo al declarar una nueva variable, de modo que podría hacer la clase newObject = c.newInstance(), pero entiendo que esto podría ser imposible ya que Java está estáticamente mecanografiado. ¿Estoy en lo cierto? ¡Gracias una vez más! – Bruno

+0

Como en mi segundo ejemplo con 'T' (o' Object') puede posponer la declaración del tipo real. Pero en algún momento necesitarás saber el tipo exacto. Si no lo necesita (para llamar a métodos), simplemente puede referirlo como 'Objeto' – Bozho

0

De esta manera:

Class c = Class.forName("com.xyzws.SomeClass"); 
Object a = c.newInstance(); 
1

Si usted tiene un constructor por defecto:

SomeClass obj2 = (SomeClass) c.newInstance(); 
+0

Gracias Adbullah. Entiendo su solución, pero observe que SomeClass, en su orden, es exactamente el tipo/clase representada por c, que en este caso asumo que no sé (excepto a través de c). Idealmente, lo que me gustaría encontrar es que algo así como la clase se pueda utilizar como un tipo al declarar una nueva variable, de modo que pudiera hacer algo como la clase newObject = c.newInstance(), pero entiendo que esto podría ser imposible ya que Java está tipado estáticamente. ¿Estoy en lo cierto? ¡Gracias una vez más! – Bruno

+0

En cualquier lenguaje orientado a objetos, debe saber el tipo de algo antes de poder hacer algo con él. En Java, esto puede ser una interfaz o una clase base, y puedes convertir a cualquiera de ellos. Sin saber nada más, es solo un Objeto y hay muy poco que puedes hacer con él. –

0

my_new_var sería de tipo Class<SomeClass>, que no es lo mismo que obj1 que es de tipo SomeClass.

Sin embargo, my_new_var.newInstance() le ofrece un objeto nuevo que es del mismo tipo que obj1.

0

Bueno, se podría hacer esto:

SomeClass obj1 = ... 
Class<? extends SomeClass> c = obj1.getClass(); 
SomeClass obj2 = c.newInstance(); 

Esto requiere un constructor sin argumentos en cualquier subclase (si existe) de SomeClassobj1 en realidad es.

Sin embargo, esto solo funciona porque conoce el tipo del objeto Class en cuestión. Dado un objeto arbitrario Class o Class<?> arbitrario, no sabría qué tipo de objeto devolvería newInstance() y solo podría declarar esa instancia como Object.

0

para mí esto funcionó:

Object innerObj = classObj.getClass().newInstance(); 
Cuestiones relacionadas