tener - tipos de constructor java
¿Puedo usar Class.newInstance() con argumentos de constructor? (8)
Asumiendo que tienes el siguiente constructor
class MyClass {
public MyClass(Long l, String s, int i) {
}
}
Necesitarás mostrar que pretendes usar este constructor así:
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);
Me gustaría usar Class.newInstance()
pero la clase que estoy creando no tiene un constructor nulo. Por lo tanto necesito poder pasar en argumentos del constructor. ¿Hay alguna forma de hacer esto?
Creo que esto es exactamente lo que quieres http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/object/arg.html
Aunque parezca un hilo muerto, alguien podría encontrarlo útil.
No utilice Class.newInstance()
; vea este hilo: ¿Por qué es Class.newInstance () el mal?
Como dicen otras respuestas, use Constructor.newInstance()
lugar.
Puede obtener otros constructores con getConstructor(...) .
Puedes usar el método getDeclaredConstructor
de Class. Se espera una serie de clases. Aquí hay un ejemplo probado y de trabajo:
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;
}
}
Siga los pasos a continuación para llamar a consturctor parametrizado.
- Obtenga
Constructor
con tipos de parámetros pasando tipos enClass[]
para el métodogetDeclaredConstructor
deClass
- Cree una instancia de constructor pasando valores en
Object[]
para
MétodonewInstance
delConstructor
Código de ejemplo:
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[]{""});
}
}
salida:
java NewInstanceWithReflection
Default constructor
Constructor :String =>
Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
Edición: según los comentarios, parece que señalar nombres de clases y métodos no es suficiente para algunos usuarios. Para obtener más información, eche un vistazo a la documentación para obtener constuctor e invocarlo .