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

时间:2015-06-18 14:12:30

标签: java file class events constructor

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

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包?请帮忙。我在想一个事件工厂?

1 个答案:

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