web-dev-qa-db-fra.com

Est-il possible d'instancier une classe par son nom en Java?

Je cherchais la question suivante: Instancier une classe à partir de son nom de chaîne qui décrit comment instancier une classe lorsque son nom est donné. Y a-t-il un moyen de le faire en Java? Je vais avoir le nom du paquet et le nom de la classe et je dois être capable de créer un objet ayant ce nom particulier.

88
ict1991

Deux façons:

Méthode 1 - uniquement pour les classes ayant un constructeur no-arg

Si votre classe a un constructeur no-arg, vous pouvez obtenir un objet Class à l'aide de Class.forName() et utiliser la méthode newInstance() pour créer une instance (sachez que cette méthode est souvent considéré comme un mal car il peut vaincre les exceptions vérifiées de Java).

Par exemple:

Class<?> clazz = Class.forName("Java.util.Date");
Object date = clazz.newInstance();

Méthode 2

Une autre approche plus sûre, qui fonctionne également si la classe n'a pas de constructeur no-arg, consiste à interroger votre objet class pour obtenir son objet Constructor et à appeler une méthode newInstance() sur cet objet:

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

Les deux méthodes sont appelées réflexion . Vous devrez généralement capturer les diverses exceptions qui peuvent survenir, notamment:

  • la JVM ne peut pas trouver ou ne peut pas charger votre classe
  • la classe que vous essayez d'instancier n'a pas le bon type de constructeurs
  • le constructeur lui-même a jeté une exception
  • le constructeur que vous essayez d'invoquer n'est pas public
  • un responsable de la sécurité a été installé et empêche la réflexion
213
Simon Nickerson
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
14
scibuff

use Class.forName ("Nom de la classe de la chaîne"). newInstance ();

Class.forName("A").newInstance();

Cela entraînera une classe nommée A initialisée.

3
Chandra Sekhar

Pour faciliter l'obtention du nom complet d'une classe afin de créer une instance à l'aide de Class.forName(...), vous pouvez utiliser la méthode Class.getName(). Quelque chose comme:

class ObjectMaker {
    // Constructor, fields, initialization, etc...
    public Object makeObject(Class<?> clazz) {
        Object o = null;

        try {
            o = Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            // There may be other exceptions to throw here, 
            // but I'm writing this from memory.
            e.printStackTrace();
        }

        return o;
    }
}

Ensuite, vous pouvez convertir l'objet que vous récupérez dans la classe que vous transmettez à makeObject(...):

Data d = (Data) objectMaker.makeObject(Data.class);
2
Roberto

tilisez Java réflexion

Création de nouveaux objets Il n'y a pas d'équivalent à l'invocation de méthode pour les constructeurs, car appeler un constructeur équivaut à créer un nouvel objet (pour être plus précis, créer un nouvel objet implique à la fois une allocation mémoire et sa construction). L'équivalent le plus proche de l'exemple précédent est donc le suivant:

import Java.lang.reflect.*;

   public class constructor2 {
      public constructor2()
      {
      }

      public constructor2(int a, int b)
      {
         System.out.println(
           "a = " + a + " b = " + b);
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("constructor2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Constructor ct 
              = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = ct.newInstance(arglist);
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

qui trouve un constructeur qui gère les types de paramètres spécifiés et l’appelle pour créer une nouvelle instance de l’objet. L'intérêt de cette approche est qu'elle est purement dynamique, avec une recherche et une invocation de constructeur au moment de l'exécution, plutôt qu'au moment de la compilation.

1
kornero

Class.forName ("ClassName") résoudra votre objectif.

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
1
Balaswamy Vaddeman
String str = (String)Class.forName("Java.lang.String").newInstance();
0
Chen Harel

quelque chose comme ça devrait marcher ...

String name = "Test2";//Name of the class
        Class myClass = Class.forName(name);
        Object o = myClass.newInstance();
0
Shashank Kadne