如何实例化对象并将其传递给循环中的其他构造函数
How to instantiate objects and passing it to other constructors in a loop
老实说,这是一个关于逻辑的问题,但我想不出答案。基本上,我有这段代码可以加载装饰器并将 Class 存储在 decoratorConstructors:
Collection<String> decorators = (Collection<String>) (((javax.swing.JButton)e.getSource()).getClientProperty( "selectedDecoratorsNames"));
ArrayList<Constructor> decoratorConstructors = new ArrayList();
String interfaceClassName = "interfaces.PizzaComponent";
Class interfaceClass = null;
Method interfaceMethodPrepare = null;
for(String decorator: decorators) {
Constructor decoratorConstructor;
Class metaFactory = null;
String decoratorName = decoratorNames.get(decorator);
String className = decoratorName + "." + decorator;
interfaceClass = Class.forName(interfaceClassName, true, sysLoader);
metaFactory = Class.forName(className, true, sysLoader);
interfaceMethodPrepare = interfaceClass.getDeclaredMethod("preparar");
decoratorConstructors.add(metaFactory.getConstructor(interfaceClass));
}
Object interfaceObject = interfaceClass;
System.out.println(decoratorConstructors);
Object pizza = interfaceClass.cast(decoratorConstructors.get(2).newInstance(
decoratorConstructors.get(1).newInstance(
decoratorConstructors.get(0).newInstance(
new PizzaSimples()
)
)
));
interfaceMethodPrepare.invoke(pizza);
我怎么 运行 循环中的这段代码:
Object pizza = interfaceClass.cast(decoratorConstructors.get(2).newInstance(
decoratorConstructors.get(1).newInstance(
decoratorConstructors.get(0).newInstance(
new PizzaSimples()
)
)
));
好吧,我已经成功地完成了我想做的事情。我使用了递归函数:
Object pizza = instantiate(decoratorConstructors, interfaceClass, decoratorConstructors.size() - 1, pizzaSimplesConstructor);
private Object instantiate(ArrayList<Constructor> decoratorConstructors, Class interfaceClass, int i, Constructor pizzaSimplesConstructor) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Object pizza = null;
if(i > -1) {
System.out.println("\nInstanciando " + decoratorConstructors.get(i));
pizza = decoratorConstructors.get(i).newInstance(instantiate(decoratorConstructors, interfaceClass, --i, pizzaSimplesConstructor));
return pizza;
}else {
return pizzaSimplesConstructor.newInstance();
}
}
老实说,这是一个关于逻辑的问题,但我想不出答案。基本上,我有这段代码可以加载装饰器并将 Class 存储在 decoratorConstructors:
Collection<String> decorators = (Collection<String>) (((javax.swing.JButton)e.getSource()).getClientProperty( "selectedDecoratorsNames"));
ArrayList<Constructor> decoratorConstructors = new ArrayList();
String interfaceClassName = "interfaces.PizzaComponent";
Class interfaceClass = null;
Method interfaceMethodPrepare = null;
for(String decorator: decorators) {
Constructor decoratorConstructor;
Class metaFactory = null;
String decoratorName = decoratorNames.get(decorator);
String className = decoratorName + "." + decorator;
interfaceClass = Class.forName(interfaceClassName, true, sysLoader);
metaFactory = Class.forName(className, true, sysLoader);
interfaceMethodPrepare = interfaceClass.getDeclaredMethod("preparar");
decoratorConstructors.add(metaFactory.getConstructor(interfaceClass));
}
Object interfaceObject = interfaceClass;
System.out.println(decoratorConstructors);
Object pizza = interfaceClass.cast(decoratorConstructors.get(2).newInstance(
decoratorConstructors.get(1).newInstance(
decoratorConstructors.get(0).newInstance(
new PizzaSimples()
)
)
));
interfaceMethodPrepare.invoke(pizza);
我怎么 运行 循环中的这段代码:
Object pizza = interfaceClass.cast(decoratorConstructors.get(2).newInstance(
decoratorConstructors.get(1).newInstance(
decoratorConstructors.get(0).newInstance(
new PizzaSimples()
)
)
));
好吧,我已经成功地完成了我想做的事情。我使用了递归函数:
Object pizza = instantiate(decoratorConstructors, interfaceClass, decoratorConstructors.size() - 1, pizzaSimplesConstructor);
private Object instantiate(ArrayList<Constructor> decoratorConstructors, Class interfaceClass, int i, Constructor pizzaSimplesConstructor) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Object pizza = null;
if(i > -1) {
System.out.println("\nInstanciando " + decoratorConstructors.get(i));
pizza = decoratorConstructors.get(i).newInstance(instantiate(decoratorConstructors, interfaceClass, --i, pizzaSimplesConstructor));
return pizza;
}else {
return pizzaSimplesConstructor.newInstance();
}
}