java with - Kann ich Class.newInstance()mit Konstruktorargumenten verwenden?




parameters deprecated (8)

Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");

Ich möchte Class.newInstance() aber die Klasse, die ich instanziiere, hat keinen Nullkonstruktor. Daher muss ich Konstruktorargumente übergeben können. Gibt es eine Möglichkeit, dies zu tun?



Sie können die Methode getDeclaredConstructor der Klasse verwenden. Es erwartet ein Array von Klassen. Hier ist ein getestetes 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;
    }
}


Folgen Sie den nachstehenden Schritten, um den parametrisierten Konstruktor aufzurufen.

  1. getDeclaredConstructor Sie Constructor mit Parametertypen ab, indem Sie types in Class[] für getDeclaredConstructor Methode getDeclaredConstructor der Class
  2. Erstellen Sie eine Konstruktorinstanz, indem Sie Werte in Object[] for übergeben
    newInstance Methode des Constructor

Beispielcode:

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[]{""});

    }
}

Ausgabe:

java NewInstanceWithReflection
Default constructor
Constructor :String => 

Angenommen, Sie haben den folgenden Konstruktor

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

    }
}

Sie müssen zeigen, dass Sie beabsichtigen, diesen Konstruktor wie folgt zu verwenden:

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


@Component ist äquivalent zu

<bean>

@Service, @Controller, @Repository = {@Component + einige weitere spezielle Funktionen}

Das bedeutet Service, Controller und Repository sind funktional gleich.

Die drei Anmerkungen werden verwendet, um "Ebenen" in Ihrer Anwendung zu trennen,

  • Controller machen nur Sachen wie Dispatching, Weiterleitung, Aufruf von Service-Methoden etc.
  • Service Hold Geschäftslogik, Berechnungen etc.
  • Repository sind die DAOs (Data Access Objects), sie greifen direkt auf die Datenbank zu.

Jetzt können Sie fragen, warum sie trennen: (Ich nehme an, Sie kennen AOP-Aspekt-orientierte Programmierung)

Nehmen wir an, Sie möchten nur die Aktivität der DAO-Schicht überwachen. Sie schreiben eine Aspect-Klasse (A-Klasse), die eine Protokollierung vor und nach jeder Methode Ihres DAO durchführt. Sie können dies mit AOP tun, da Sie drei verschiedene Layer haben und nicht gemischt sind.

So können Sie DAO "herum", "vor" oder "nach" den DAO-Methoden protokollieren. Sie könnten das tun, weil Sie überhaupt ein DAO hatten. Was Sie gerade erreicht haben, ist die Trennung von Sorgen oder Aufgaben.

Stellen Sie sich vor, es gäbe nur eine Annotation @Controller, dann hätte diese Komponente Dispatching, Geschäftslogik und Zugriff auf die Datenbank, alles gemischt, also schmutziger Code!

Oben erwähnt ist ein sehr häufiges Szenario, es gibt viel mehr Anwendungsfälle von warum drei Anmerkungen zu verwenden.





java constructor