2009-12-12 16 views
15

Sí, lo sé. Título largo de la pregunta ... Así que tengo el nombre de la clase en la cadena. Estoy creando dinámicamente objeto de esa clase de esta manera:Convertir dinámicamente el objeto java de la clase Object en una clase determinada cuando se conoce el nombre de clase

String className = "com.package.MyClass"; 
Class c = Class.forName(className); 
Object obj = c.newInstance(); 

¿Cómo puedo convertir dinámicamente que obj a MiClase objeto? No puedo escribir de esta manera:

MyClass mobj = (MyClass)obj; 

... porque className puede ser diferente.

+0

Ese código no convierte: se typecasts. ¿Es eso lo que quieres decir? – EJP

Respuesta

17

no, declarar una interfaz que declara los métodos que le gustaría ser contactado:

public interface MyInterface 
{ 
    void doStuff(); 
} 

public class MyClass implements MyInterface 
{ 
    public void doStuff() 
    { 
    System.Console.Writeln("done!"); 
    } 
} 

continuación, utiliza

MyInterface mobj = (myInterface)obj; 
mobj.doStuff(); 

Si MyClass no está bajo su control, entonces se puede' t hacer que implemente alguna interfaz, y la otra opción es confiar en la reflexión (see this tutorial).

+0

Aunque estoy de acuerdo con Greg en la mayoría de los casos; Me encontré en una situación en la que no quiero saber sobre interfaces. No sé si ese tutorial anterior abordó este tema, pero ninguno de los que encontré en mi investigación sobre el tema lo hizo. Aquí hay una solución dinámica que surgió (necesitaría saber el nombre del método/campo así como el nombre de la clase): http://forums.sun.com/thread.jspa?threadID=5419973 – LostNomad311

+0

Aunque la pregunta es bastante antigua, pero en mi opinión hay una manera mucho mejor de implementar la funcionalidad dada (Invocar las funciones). 'URLClassLoader classLoader = URLClassLoader.newInstance (nueva URL [] {parentDirectory.toURI(). ToURL()}); Clase myClass = classLoader.loadClass (className); Método doStuff = myClass.getDeclaredMethod ("doStuff"); doStuff.invoke (helloClass.newInstance()); ' – CoderX

2

Si no sabía que mojb es del tipo MyClass, ¿cómo puede crear esa variable?

Si MyClass es un tipo de interfaz, o un tipo super, entonces no hay necesidad de hacer un molde.

3

No tiene que convertir el objeto en un objeto MyClass porque ya lo es. Lo que realmente quieres hacer es lanzarlo, pero dado que el nombre de la clase no se conoce en tiempo de compilación, no puedes hacer eso, ya que no puedes declarar una variable de esa clase. Supongo que quiere/necesita algo como "pato escribiendo", es decir, no conoce el nombre de la clase, pero conoce el nombre del método en tiempo de compilación. Las interfaces, según lo propuesto por Gregory, son su mejor opción para hacer eso.

+0

Si realmente necesita este tipo de característica, considere otro idioma: groovy es aquel que se ejecuta en el jvm pero tiene la función que desea. – Chii

44

Creo que es bastante sencillo con la reflexión

MyClass mobj = MyClass.class.cast(obj); 

y si el nombre de clase es diferente

Object newObj = Class.forName(classname).cast(obj); 
+0

Esto es simple y directo. Gracias Lukas. –

+1

Esta es la mejor solución, he estado buscando este tipo de enfoque y finalmente lo encontré – Yahya

+0

Es simple y funcionó bien. –

Cuestiones relacionadas