web-dev-qa-db-fra.com

Conversion dynamique Java objet de la classe Object en une classe donnée lorsque le nom de la classe est connu

Ouais je sais. Titre long de la question ... J'ai donc le nom de classe dans la chaîne. Je crée dynamiquement un objet de cette classe de cette manière:

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

Comment puis-je convertir dynamiquement cet objet obj en MyClass? Je ne peux pas écrire de cette façon:

MyClass mobj = (MyClass)obj;

... car className peut être différent.

28
Pawka

vous ne le faites pas, déclarez une interface qui déclare les méthodes que vous souhaitez appeler:

public interface MyInterface
{
  void doStuff();
}

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

alors vous utilisez

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

Si MyClass n'est pas sous votre contrôle, vous ne pouvez pas lui faire implémenter une interface, et l'autre option est de s'appuyer sur la réflexion ( voir ce tutoriel ).

22
Gregory Pakosz

Je pense que c'est assez simple avec réflexion

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

et si le nom de classe est différent

Object newObj = Class.forName(classname).cast(obj);
66
user2308814

Vous n'avez pas besoin de convertir l'objet en objet MyClass car il l'est déjà. Ce que vous voulez vraiment faire, c'est le transtyper, mais comme le nom de la classe n'est pas connu au moment de la compilation, vous ne pouvez pas le faire, car vous ne pouvez pas déclarer une variable de cette classe. Je suppose que vous voulez/avez besoin de quelque chose comme "typage du canard", c'est-à-dire que vous ne connaissez pas le nom de la classe mais que vous connaissez le nom de la méthode au moment de la compilation. Les interfaces, comme proposé par Gregory, sont votre meilleur pari pour le faire.

3
Erich Kitzmueller
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
    return (T) obj;
}
2
appmaster

Si vous ne saviez pas que mojb est de type MyClass, comment pouvez-vous créer cette variable?

Si MyClass est un type d'interface ou un super type, il n'est pas nécessaire de faire un cast.

2
Chii