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.
Deux façons:
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();
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:
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
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.
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);
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.
Class.forName ("ClassName") résoudra votre objectif.
Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
String str = (String)Class.forName("Java.lang.String").newInstance();
quelque chose comme ça devrait marcher ...
String name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();