Comment obtenir un objet de classe à partir du nom de classe en Java

Je connais le nom de la classe, disons "MyClass" et je veux récupérer l'objet Class, c'est-à-dire. Maclasse.classe pour les références futures. Est-il un moyen de le faire?

J'ai regardé à travers le web, mais la plupart des choses que j'ai trouvées liées à cela concernaient le ClassLoader, qui, je présume, ne conviennent pas à mon cas. Je ne veux pas initialiser une classe, mais seulement obtenir un objet de classe pour des utilisations futures.

EDIT: en ce qui concerne les premières réponses à ceci:

J'ai déjà vérifié la méthode forName() mais je pensais que c'est censé aussi initialiser la classe. Maintenant, je peux l'appeler avec les arguments complets et passer false au deuxième argument, mais le troisième devrait-il être null ou quoi?

Serait

Class.forName("MyClass", false, null);

Retour MyClass.class?

En fait, ce que je veux faire, c'est remplacer un tableau d'identifiants de chaîne associés aux objets Class, par un tableau d'identifiants à partir desquels les objets de classe sont récupérés automatiquement, pour se débarrasser d'un travail manuel:)

Merci pour le réponses rapides et désolé de ne pas mentionner cela avant.

28
demandé sur alkar 2009-09-17 16:03:06

4 réponses

, Vous pouvez utiliser:

Class c = Class.forName("com.package.MyClass");

Et plus tard instancier un objet:

Object obj = c.newInstance();

EDIT: c'est juste le cas d'utilisation le plus simple. Comme indiqué dans les commentaires, vous devrez considérer les arguments du constructeur et les exceptions lancées par le processus d'initialisation. Le Javadoc newInstance a tous les détails.

45
répondu Tony the Pony 2009-09-17 12:36:09
Class.forName("MyClass")

Lisez le JavaDoc pour plus de détails

7
répondu Joachim Sauer 2009-09-17 12:05:15

, Il semble que vous pourriez être en mesure d'utiliser l'Class de catégorie's statique forName méthode.

3
répondu Thomas Owens 2009-09-17 12:05:22

Il est également intéressant de noter que les suggestions ci-dessus sont correctes, mais ne fonctionneront que pour les constructeurs par défaut (sans paramètre). Vous pouvez également faire quelque chose comme:

    public Object newInstance(String className, Object...args) throws Exception {
        Class<?> clazz = Class.forName(className);
        if(args == null || args.length == 0) {
            return clazz.newInstance();
        }

        List<Class<?>> argTypes = new ArrayList<Class<?>>();
        for(Object object : args) {
            argTypes.add(object.getClass());
        }
        Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()]));
        return explicitConstructor.newInstance(args);
    }
2
répondu Droo 2009-09-17 16:31:38