我有一个控制器类,它基本上包含一个事件列表。
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());
}
});
我的问题是事件具有不同的构造函数参数类型和长度;我不知道如何从我的文件中构建它们。我是这类工作的新手,我认为这是工厂实施的一部分。
我是否使用Reflect包?请帮忙。我在想一个事件工厂?
答案 0 :(得分:0)
感谢社区的帮助。当提供字符串数组参数{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;
}