我有一个控制器类,它基本上包含一个事件列表。
ArrayList <Event> eventList = new ArrayList<>();
控制器有一个 addEvent(Event e) 方法。
我已将控制器类扩展为特定类型的控制器,并扩展事件以将特定类型的事件作为内部类为我的新控制器提供。
public class NewController extends Controller{
//.. controller code/methods
class SpecificEvent extends Event{
//..
}
}
我已经对控制器进行了硬编码,使其按预期工作,但我希望能够制作一个配置文件来填充我的事件列表。
我制作了一个包含事件列表的.txt文件:
Event=SpecificEvent, Arg1=<Integer>val, .. ArgN=<?>val, Event=SpecificEventN, ArgN=<?>val
我将事件类名和参数过滤到一个列表中:
fileContents.stream()
.forEach(s -> {
Scanner sc = new Scanner(s)
.useDelimiter("=|,");
while (sc.hasNext()){
Scanner sc2 = new Scanner(sc.next()).useDelimiter("[//w]");
args.add(sc.next());
}
});
我的问题是事件具有不同的构造函数参数类型和长度;我不知道如何从我的文件构建它们。我是这类工作的新手,我认为这是工厂实施的运行。
我是否使用反射包?请帮忙。我在考虑一个活动工厂?
感谢社区的帮助。当提供字符串数组参数时,此工厂将完成这项工作,{String classname, args.... }
/**
* ClassFactory method, build an event.
*
* @param arguments Required arguments to build an Event.
* @return Built event.
* @throws java.lang.ClassNotFoundException
*/
public Event buildEvent(String [] arguments) throws ClassNotFoundException {
Class<?>[] argumentTypes = {};
Object[] parameters = {};
try {
//define the class type from the first argument
Class<?> eventClass
= Class.forName(packageName + arguments[0]);
if (arguments.length() > 1) {
argumentTypes = new Class<?>[]{Long.TYPE};
parameters = new Object[]{Long.parseLong(arguments[1])};
Constructor<?> constructor
= eventClass.getDeclaredConstructor(argumentTypes);
Object instance = constructor.newInstance(parameters);
return ((Event) instance);
//default
} else {
Constructor<?> constructor
= eventClass.getDeclaredConstructor();
Object instance = constructor.newInstance();
return ((Event) instance);
}
} catch (ClassNotFoundException cnfe) {
System.out.println("Class not available in this package.");
} catch (NoSuchMethodException |
SecurityException |
InstantiationException |
IllegalAccessException |
IllegalArgumentException |
InvocationTargetException e) {
log.log(Level.SEVERE, "Class Builder: {0}", e.getMessage());
}
return null;
}