Если вы хотите реализовать свое оригинальное решение (myClass.newInstance(args)
) - вы можете сделать это следующим образом (одно предложение, обязательно вы можете придумать свое):
shape.1.triangle.arg1.int = 3<br>
shape.1.triangle.arg2.int = 4<br>
shape.1.triangle.arg3.int = 5<br>
shape.1.triangle.arg4.String = "My first triangle"<br>
shape.2.rectangle.arg1.int = 4<br>
shape.2.rectangle.arg2.int = 7<br>
shape.2.rectangle.arg3.String = "Another string label"
Ваш код может затем использовать class.getConstructor(Class<?> ... parameterType)
, чтобы получить правильный конструктор, и вызвать newInstance(Object ... args)
для объекта Constructor
.
Пример:
Class<?> shape = Class.forName("triangle");
Constructor<?> constructor = shape.getConstructor(Integer.TYPE, Integer.TYPE, Integer.TYPE, String.class);
constructor.newInstance(Integer.TYPE, Integer.TYPE, Integer.TYPE, String.class);
Надеюсь, это было полезно.
Другая альтернатива - использовать шаблон FactoryBuilder.
shape.triangle.factory=TriangleFactory
shape.rectangle.factory=RectangleFactory
shape.1.triangle.arg1 = 3
shape.1.triangle.arg2 = 4
shape.1.triangle.arg3 = 5
shape.1.triangle.arg4 = "My first triangle"
shape.2.rectangle.arg1 = 4
shape.2.rectangle.arg2 = 7
shape.2.rectangle.arg3 = "Another string label"
А вам понадобится:
public interface IShapeFactory
{
public IShape buildShape(Object ... args);
}
public class TriangleFactory implements IShapeFactory
{
public IShape buildShape(Object ... args)
{
return new Triangle(args[0], args[1], args[2], args[3]); // You will need some casting here :)
}
}
Все, что вам нужно сделать, это создать экземпляр фабрики, вызвать метод buildShape
с аргументами, и фабрика сделает то, что нужно.
Второе решение кажется мне более приятным, и я думаю, что вам будет проще, но если формы предоставляются извне, вашим пользователям будет сложнее реализовать новые формы.
Ваш звонок.