JAVA création d'une liste d'événements à partir d'un fichier texte


J'ai une classe de contrôleur, elle contient essentiellement une liste d'événements.

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

Le contrôleur a une méthode addEvent(Event e).

J'ai étendu la classe controller pour être un type spécifique de contrôleur, et extended event pour fournir des types d'événements spécifiques pour mon nouveau contrôleur en tant que classes internes.

public class NewController extends Controller{
    //.. controller code/methods
    class SpecificEvent extends Event{
        //..
    } 
}

J'ai codé en dur mon contrôleur pour fonctionner comme prévu, mais je voulais pouvoir créer un fichier de configuration qui remplirait ma liste d'événements.

J'ai fait un .txt fichier avec une liste d'événements:

Event=SpecificEvent, Arg1=<Integer>val, .. ArgN=<?>val, Event=SpecificEventN, ArgN=<?>val

J'ai filtré le nom de la classe d'événement et les arguments dans une liste:

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

Mon problème est que les événements ont des types et des longueurs d'arguments de constructeur différents; je ne sais pas comment les construire à partir de mon fichier. Je suis nouveau dans ce genre de travail et je pense que c'est la mise en œuvre de l'usine.

Est-ce que j'utilise le package Reflect? S'il vous plaît aider. Je pensais à un Événement de l'Usine?

Author: iinertiaii, 2015-06-18

1 answers

Merci pour l'aide de la communauté. Cette usine fera le travail lorsqu'un argument de tableau de chaînes est fourni, {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;
}
 0
Author: iinertiaii, 2015-07-27 14:08:49