2008-10-24 4 views

Antwort

79
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list); 

Edit: nach den Kommentaren scheint wie Klasse und Methodennamen zu zeigen ist nicht genug für einige Benutzer. Weitere Informationen finden Sie in der Dokumentation für getting constuctor und invoking it.

+17

Antwort sagt nicht, wie Sie die Argumente übergeben oder ein Beispiel zeigen. Es ist nur eine Vermutung. – djangofan

+2

Sollte es GetDeclaredConstructor (Singular) sein? –

+0

@ryvantage macht es nicht wie eine statische Methode aussehen, da es in der "myObject" -Instanz aufgerufen wird. Es ist nur eine Verkettung von Methodenaufrufen. Auch nicht sicher, warum diese Antwort 55 Leuten nützlich war, weil es falsch ist und das Recht unten ist! – Arran

164
Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG"); 
+16

Nur klärende - 'getDeclaredConstructor' ist keine statische Methode, Sie müssen es auf die Instanz der Klasse für Ihre spezifische Klasse aufrufen. – clum

+0

Scheint wie die Antwort ist "Nein" für Java 1.1 – Jim

+0

Ich habe öffentlichen Konstruktor mit der Liste Parameter. Kann nicht von getDeclaredConstructor abgerufen werden, aber mit getConstructor funktioniert gut. Weißt du, warum? – Line

13

Nicht verwenden Class.newInstance(); Siehe dieses Thema: Why is Class.newInstance() evil?

Wie andere Antworten sagen, verwenden Sie stattdessen Constructor.newInstance().

+0

Ich refaktoriert meinen Code basierend auf dieser Antwort, und ich denke, ist die beste Lösung –

2

Sie können die getDeclaredConstructor Methode der Klasse verwenden. Es erwartet ein Array von Klassen. Hier ist ein erprobtes und funktionierendes Beispiel:

public static JFrame createJFrame(Class c, String name, Component parentComponent) 
{ 
    try 
    { 
     JFrame frame = (JFrame)c.getDeclaredConstructor(new Class[] {String.class}).newInstance("name"); 
     if (parentComponent != null) 
     { 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     } 
     else 
     { 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     } 
     frame.setLocationRelativeTo(parentComponent); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    catch (InstantiationException instantiationException) 
    { 
     ExceptionHandler.handleException(instantiationException, parentComponent, Language.messages.get(Language.InstantiationExceptionKey), c.getName()); 
    } 
    catch(NoSuchMethodException noSuchMethodException) 
    { 
     //ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.NoSuchMethodExceptionKey, "NamedConstructor"); 
     ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.messages.get(Language.NoSuchMethodExceptionKey), "(Constructor or a JFrame method)"); 
    } 
    catch (IllegalAccessException illegalAccessException) 
    { 
     ExceptionHandler.handleException(illegalAccessException, parentComponent, Language.messages.get(Language.IllegalAccessExceptionKey)); 
    } 
    catch (InvocationTargetException invocationTargetException) 
    { 
     ExceptionHandler.handleException(invocationTargetException, parentComponent, Language.messages.get(Language.InvocationTargetExceptionKey)); 
    } 
    finally 
    { 
     return null; 
    } 
} 
53

Angenommen, Sie haben die folgende

Konstruktor
class MyClass { 
    public MyClass(Long l, String s, int i) { 

    } 
} 

Sie müssen Sie zeigen wollen diesen Konstruktor verwenden wie so:

Class classToLoad = MyClass.class; 

Class[] cArg = new Class[3]; //Our constructor has 3 arguments 
cArg[0] = Long.class; //First argument is of *object* type Long 
cArg[1] = String.class; //Second argument is of *object* type String 
cArg[2] = int.class; //Third argument is of *primitive* type int 

Long l = new Long(88); 
String s = "text"; 
int i = 5; 

classToLoad.getDeclaredConstructor(cArg).newInstance(l, s, i); 
+1

gute Antwort .... –

5

Folgen Sie die nachstehenden Schritte, um den parametrisierten Konstruktor aufzurufen.

  1. Get Constructor mit Parametertypen, indem Typen in Class[] für getDeclaredConstructor Verfahren von Class
  2. Konstruktor Instanz Erstellen von Werten in Object[] für
    newInstance Methode von Constructor

Beispielcode vorbei:

import java.lang.reflect.*; 

class NewInstanceWithReflection{ 
    public NewInstanceWithReflection(){ 
     System.out.println("Default constructor"); 
    } 
    public NewInstanceWithReflection(String a){ 
     System.out.println("Constructor :String => "+a); 
    } 
    public static void main(String args[]) throws Exception { 

     NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance(); 
     Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor(new Class[] {String.class}); 
     NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"}); 

    } 
} 

Ausgabe:

java NewInstanceWithReflection 
Default constructor 
Constructor :String => StackOverFlow