2015-06-18 8 views
1

У меня есть класс контроллера, он в основном содержит список событий.JAVA создает список событий из текстового файла

ArrayList <Event> eventList = new ArrayList<>(); 

Контроллер имеет метод addEvent (событие 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

Да, вы должны использовать отражение. Начните с рассмотрения всех методов [java.lang.Class] (http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html). – VGR

+0

Почему обычная сериализация не опция? – Fildor

+0

@VGR К сожалению, я не ожидал ответа. Это означает, что мне, скорее всего, понадобится создать какой-то оператор switch, основанный на строке типа события на моей фабрике событий. Благодаря! – iinertiaii

ответ

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; 
} 
Смежные вопросы