JAVA 从文本文件创建事件列表



我有一个控制器类,它基本上包含一个事件列表。

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;
}

相关内容

  • 没有找到相关文章

最新更新