2009-04-03 12 views

Odpowiedz

0

Nie można w ten sposób konstruować nowych zajęć.

Jeśli masz nazwę klasy, możesz użyć Class.forName (className), aby załadować/odwołać się do klasy.

Jeśli masz kod bajtowy dla klasy, którą chcesz utworzyć, możesz załadować kod bajtowy i załadować klasę. To prawdopodobnie będzie bardziej zaawansowane, niż zamierzałeś.

+2

Pyta o to, jak utworzyć instancję nowej instancji klasy, a nie utworzyć obiekt klasy (ani jak uzyskać kod bajtowy). To nie powinno być oznaczone jako poprawna odpowiedź. Czytaj dalej do odpowiedzi Andri poniżej. –

+1

@RyanShillington To odpowiada na oryginalne pytanie. Pytanie zostało zmienione na inne pytanie, na które odpowiedział "andri". –

+0

Ah, rozumiem. Mój błąd. –

1

Jeśli posiadasz listę obiektów Class uzyskanych poprzez literały klas, możesz równie dobrze statycznie odwoływać się do konstruktorów, niż poślizgnąć się w szatańskiej refleksji.

+0

Być może instancja jest wykonywana w programie usługowym, który zostanie połączony z kilkoma innymi programami, które jeszcze nie zostały jeszcze utworzone. Będą wywoływać program serwisowy, każdy z inną listą zawierającą zmienne klasy dla klas, które nie istniały podczas pisania programu serwisowego. – RenniePet

2

Java jest tak zaprojektowana, że ​​nie można jej nigdy "oszukać", dopóki używa się java.lang/java. klasy lub inne standardowe biblioteki. Jedną z najważniejszych rzeczy w OOP jest to, że obiekty powinny znajdować się w określonym stanie, więc możesz być bezpieczny, że konstruktor jest zawsze uruchamiany. Nawet jeśli używasz dziwnie wyglądających bibliotek refleksji, aby wykonać swoją pracę.

Tak, używając Class.forName ("me.Test"). NewInstance(); (lub podobnym) spodoba się konstruktorowi Test() dla ciebie.

Jeśli chcesz wywołać inny konstruktor kod jest coś takiego:

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

Tutaj getConstructor pyta co konstruktor wygląda (chce ciąg), a następnie wywołać ją z ciągiem.

9

Wystarczy dodać jeden punkt mi brakuje:

Można powołać newInstance bezpośrednio na obiekcie Class jeśli ma publicznego konstruktora zerowej. (Konstruktor zerowy jest konstruktorem bez argumentów.)

W przeciwnym razie można znaleźć konstruktorów za pośrednictwem Class.getConstructors(), jak powiedzieli inni.

Powiązane problemy