Je voudrais utiliser Class.newInstance()
mais la classe que je suis en train d'instancier n'a pas de constructeur nullary. Par conséquent, je dois pouvoir passer des arguments de constructeur. Y a-t-il un moyen de faire cela?
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
ou
obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
Éditer: selon les commentaires, il semble que pointer du nom de classe et de méthode ne soit pas suffisant pour certains utilisateurs. Pour plus d'informations, jetez un coup d'œil à la documentation de obtenir constuctor et l'invoquer .
En supposant que vous ayez le constructeur suivant
class MyClass {
public MyClass(Long l, String s, int i) {
}
}
Vous devrez montrer que vous avez l'intention d'utiliser ce constructeur comme suit:
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);
Ne pas utiliser Class.newInstance()
; voir ce fil: Pourquoi Class.newInstance () est-il diabolique?
Comme d’autres réponses, utilisez Constructor.newInstance()
à la place.
Suivez les étapes ci-dessous pour appeler un consturateur paramétré.
Constructor
avec les types de paramètre en passant les types dans la méthode Class[]
pour getDeclaredConstructor
de Class
Object[]
pournewInstance
méthode de Constructor
Exemple de code:
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"});
}
}
sortie:
Java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
Vous pouvez obtenir d'autres constructeurs avec getConstructor (...) .
Je pense que c'est exactement ce que vous voulez http://da2i.univ-lille1.fr/doc/tutorial-Java/reflect/object/arg.html
Bien que cela semble un fil mort, quelqu'un pourrait le trouver utile
Vous pouvez utiliser la méthode getDeclaredConstructor
de Class. Il attend un tableau de classes. Voici un exemple testé et fonctionnel:
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;
}
}