Frage Gibt es eine Möglichkeit, eine Klasse namentlich in Java zu instanziieren?


Ich sah wie die Frage aus: Instanziieren Sie eine Klasse aus ihrem String-Namen Hier wird beschrieben, wie eine Klasse instanziiert wird, wenn sie ihren Namen hat. Gibt es eine Möglichkeit, dies in Java zu tun? Ich werde den Paketnamen und den Klassennamen haben und ich muss in der Lage sein, ein Objekt mit diesem bestimmten Namen zu erstellen.


75
2018-03-27 08:58


Ursprung


Antworten:


Zwei Wege:

Methode 1 - nur für Klassen mit einem Konstruktor ohne Argumente

Wenn Ihre Klasse einen Konstruktor ohne Argumente hat, können Sie eine Class Objekt verwenden Class.forName() und benutze die newInstance() Methode, um eine Instanz zu erstellen (obwohl Vorsicht, dass diese Methode oft ist als böse betrachtet weil es Javas geprüfte Ausnahmen besiegen kann).

Beispielsweise:

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

Methode 2

Ein alternativer sicherer Ansatz, der auch funktioniert, wenn die Klasse keine arg-Konstruktoren hat, besteht darin, das Klassenobjekt abzufragen, um es zu erhalten Constructor Objekt und rufe a auf newInstance() Methode für dieses Objekt:

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

Beide Methoden sind bekannt als Betrachtung. In der Regel müssen Sie die verschiedenen möglichen Ausnahmen abfangen, darunter:

  • Die JVM kann Ihre Klasse nicht finden oder nicht laden
  • Die Klasse, die Sie instanziieren möchten, hat nicht die richtige Art von Konstruktoren
  • Der Konstruktor selbst hat eine Ausnahme ausgelöst
  • Der Konstruktor, den Sie aufrufen möchten, ist nicht öffentlich
  • Ein Sicherheitsmanager wurde installiert und verhindert das Auftreten von Reflektionen

194
2018-03-27 09:02



MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();

12
2018-03-27 09:01



benutzen Class.forName ("String-Name der Klasse"). NewInstance ();

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

Dies führt dazu, dass die Klasse A initialisiert wird.


3
2018-03-27 08:59



Um es zu erleichtern, den vollständig qualifizierten Namen einer Klasse zu erhalten, um mit Hilfe einer Instanz eine Instanz zu erstellen Class.forName(...)Man könnte das benutzen Class.getName() Methode. Etwas wie:

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;
    }
}

Dann können Sie das Objekt, das Sie erhalten, in die Klasse zurückwerfen, in die Sie gehen makeObject(...):

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

2
2017-12-31 18:27



Verwenden Sie Java-Reflektion

Erstellen neuer Objekte Es gibt kein Äquivalent zum Methodenaufruf für Konstruktoren, da das Aufrufen eines Konstruktors dem Erstellen eines neuen Objekts entspricht (um genau zu sein, umfasst das Erstellen eines neuen Objekts sowohl die Speicherzuweisung als auch die Objektkonstruktion). Das nächste Äquivalent zum vorherigen Beispiel ist also:

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);
         }
      }
   }

der einen Konstruktor findet, der die angegebenen Parametertypen behandelt und aufruft, um eine neue Instanz des Objekts zu erstellen. Der Wert dieses Ansatzes besteht darin, dass er rein dynamisch ist und Konstruktorsuche und -aufruf zur Ausführungszeit statt zur Kompilierungszeit erfolgt.


1
2018-03-27 09:03



Class.forName ("Klassenname") wird deinen Zweck lösen.

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();

1
2018-03-27 09:05



String str = (String)Class.forName("java.lang.String").newInstance();

0
2018-03-27 09:01



so etwas sollte funktionieren ...

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

0
2018-03-27 09:03