使用来自文本文件的已解析输入作为新事件的参数

时间:2017-11-09 17:57:57

标签: java parsing text input variable-assignment

我正在进行一项任务,要求我改变类中的方法以从文本文件中获取内容,并使用它来创建Event类的各种子类的多个实例。这是文本文件:

Event=ThermostatNight,time=0
Event=LightOn,time=2000
Event=WaterOff,time=8000
Event=ThermostatDay,time=10000
Event=Bell,time=9000
Event=WaterOn,time=6000
Event=LightOff,time=4000
Event=Terminate,time=12000

Event = *是子类的名称,而time = *是在子类的构造函数中使用的参数。 Event类本身是一个抽象类,用于继承。

public class Restart extends Event {
  Class eventClass;
  String eventInput;
  Long timeDelay;


  public Restart(long delayTime, String filename) {
      super(delayTime);
      eventsFile = filename;
}

    public void action() {
    List<String> examples = Arrays.asList("examples1.txt", "examples2.txt", "examples3.txt", "examples4.txt");
    for (String example : examples) {
        //finding pattern using Regex
        Pattern pattern = Pattern.compile(example);
        Matcher matcher1 = pattern.matcher(eventsFile);
        if (matcher1.find()) {
            File file = new File(example);
            String line;
            try {
                FileReader fileReader = new FileReader(file);
                Scanner sc = new Scanner(file);

                BufferedReader bufferedReader =
                        new BufferedReader(fileReader);

                while ((line = bufferedReader.readLine()) != null) {
                    sc.useDelimiter("\n");
                    //Parsing through text
                    while (sc.hasNext()) {
                        String s = sc.next();
                        String[] array1 = s.split(",");
                        String[] array2 = array1[0].split("=");
                        eventInput = array2[1];
                        String[] array3 = array1[1].split("=");
                        String timeInput = array3[1];

                        try {
                            eventClass = Class.forName(eventInput);
                            timeDelay = Long.parseLong(timeInput);


                            try {

                            addEvent(new eventClass(timeDelay));
                            }
                            //catch block
                            catch(NoSuchMethodException e){
                            System.out.println("No Such Method Error");
                            } catch (Exception e) {
                                System.out.println("error");
                            }

                       //catch block     
                       } catch (ClassNotFoundException ex) {
                            System.out.println("Unable to locate Class");
                       } catch (IllegalAccessException ex) {
                            System.out.println("Illegal Acces Exception"); 
                       } catch (InstantiationException ex) {
                            System.out.println("Instantiation Exception");
                       }



                    }
                }
                //Close bufferedReader
                bufferedReader.close();
            }
            //catch block
            catch (FileNotFoundException ex) {
                System.out.println(
                        "Unable to open file '" +
                                file + "'");
            } catch (IOException ex) {
                ex.printStackTrace();
            }


            break;
        }
        //if input match is not found
        else {
            System.out.println("No Match Found");}

    }
}

我似乎能够解析好,并找到我正在寻找的字符串,但我无法使用eventInput,我从文本文件中提取作为参数来创建一个新事件。

eventClass = Class.forName(eventInput);

似乎也没有将我的字符串变成可接受的参数。

非常感谢任何帮助!

我知道我可能在这里遗漏了一些关键词,但我一直盯着它看起来似乎是一个失败的原因。

这是Event类:

public abstract class Event {
private long eventTime;
protected final long delayTime;
public Event(long delayTime) {
  this.delayTime = delayTime;
  start();
}
public void start() { // Allows restarting
  eventTime = System.currentTimeMillis() + delayTime;
}
public boolean ready() {
  return System.currentTimeMillis() >= eventTime;
}
public abstract void action();
} ///:~

1 个答案:

答案 0 :(得分:0)

我认为你误解了反射是如何运作的。获得Class对象(Class.forName()的输出后,您必须找到合适的构造函数

Constructor<T> constructor = eventClass.getConstructor(parameter types)

然后使用

创建一个新实例
constructor.newInstance(parameters);

对于无参数构造函数,有一个快捷方式

eventClass.newInstance();

我强烈建议您在继续之前阅读有关反思的教程。