2009-04-03 11 views

Antwort

0

Sie können auf diese Weise keine neuen Klassen erstellen.

Wenn Sie den Namen einer Klasse haben, können Sie mit Class.forName (className) eine Klasse laden/referenzieren.

Wenn Sie den Bytecode für eine Klasse haben, die Sie erstellen möchten, können Sie einen Klassenlader den Bytecode laden lassen und Ihnen die Klasse geben. Dies ist wahrscheinlich fortgeschrittener als Sie beabsichtigt haben.

+2

Er fragt, wie man eine neue Instanz der Klasse instanziiert, nicht das Klassenobjekt erzeugt (und auch nicht, wie man den Byte-Code bekommt). Dies sollte nicht als die richtige Antwort markiert werden. Lesen Sie weiter unten die Antwort von andri. –

+1

@RyanShillington Dies ist die ursprüngliche Frage. Die Frage wurde bearbeitet, um eine andere Frage zu sein, die "andri" beantwortete. –

+0

Ah, ich verstehe. Mein Fehler. –

1

Wenn Sie eine Liste von Class Objekten haben, die durch Klassenliterale erhalten werden, können Sie auch die Konstruktoren statisch referenzieren, anstatt in die Reflexions-Boshaftigkeit zu schlüpfen.

+0

Die Instanziierung wird möglicherweise in einem Serviceprogramm durchgeführt, das mit mehreren anderen Programmen verknüpft wird, die noch nicht einmal erstellt wurden. Sie rufen das Serviceprogramm mit jeweils einer anderen Liste auf, die Klassenvariablen für Klassen enthält, die beim Schreiben des Serviceprogramms nicht vorhanden waren. – RenniePet

2

Java ist so konzipiert, dass Sie es niemals "austricksen" können, solange Sie java.lang/java verwenden. Klassen oder andere Standardbibliotheken. Eines der wichtigsten Dinge von OOP ist, dass Objekte in einem definierten Zustand sein sollten, so dass Sie sicher sein können, dass der Konstruktor immer ausgeführt wird. Selbst wenn Sie einige seltsam aussehende Reflexions-Bibliotheken verwenden, um Ihre Arbeit zu erledigen.

Also, mit Class.forName ("me.Test"). NewInstance(); (oder ähnlich) wird den Konstruktor Test() für Sie aufrufen.

Wenn Sie einen anderen Konstruktor aufrufen wollen, dass der Code ist so etwas wie:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World"); 

Hier ist der GetConstructor fragt, was der Konstruktor aussieht (es einen String will), und dann rufen Sie es mit einer Schnur.

9

Nur ein Punkt hinzufügen Ich sehe fehlt:

Sie newInstance direkt auf dem Class Objekt aufrufen kann, wenn es eine öffentliche null Konstruktor hat. (Null-Konstruktor ist der Konstruktor ohne Argumente.)

Andernfalls können Sie Konstruktoren über Class.getConstructors() finden, wie andere gesagt haben.

Verwandte Themen