Sto utilizzando una factory astratta per restituire istanze di sottoclassi concrete. Vorrei creare un'istanza delle sottoclassi in fase di runtime data una stringa del nome della classe concreta. Devo anche passare un parametro ai costruttori. La struttura di classe è la seguente:Java Instantiate Class in fase di runtime con parametri
abstract class Parent {
private static HashMap<String, Child> instances = new HashMap<String,Child>()
private Object constructorParameter;
public static Child factory(String childName, Object constructorParam){
if(instances.keyExists(childName)){
return instances.get(childName);
}
//Some code here to instantiate the Child using constructorParam,
//then save Child into the HashMap, and then return the Child.
//Currently, I am doing:
Child instance = (Child) Class.forName(childClass).getConstructor().newInstance(new Object[] {constructorParam});
instances.put(childName, instance);
return instance;
}
//Constructor is protected so unrelated classes can't instantiate
protected Parent(Object param){
constructorParameter = param;
}
}//end Parent
class Child extends Parent {
protected Child(Object constructorParameter){
super(constructorParameter);
}
}
mio attmept sopra sta gettando la seguente eccezione: java.lang.NoSuchMethodException: Child.<init>()
, seguita dalla traccia dello stack.
Qualsiasi aiuto è apprezzato. Grazie!
Ho provato questo e sto ancora vedendo lo stesso errore. Devo modificare le firme del costruttore? Al momento le firme non prevedono esplicitamente parametri di tipo Object, ma di qualcosa di più specifico. – bibs
il tuo 'constructorParam.getClass()' dovrebbe restituire il tipo esatto di parametro che ti aspetti – Bozho
In base all'esempio, non sono sicuro di ciò che fa constructorParam.getClass(). Puoi spiegare meglio la tua risposta? Grazie! – trusktr