将文本文件值转换为Java中的其他类型

时间:2013-12-10 22:52:04

标签: java

我有一个接受这样的事件的方法:

   addEvent(Event event);

Event构造函数接受如下的long类型:

   Event(long delayTime);

因此,我可以明确地将参数定义为addEvent,如下所示:

   addEvent(new ThermostatNight(2000)); //ThermostatNight=Event and 2000=delayTime

但是,我想从文本文件中提取EventdelayTime值,将它们保存在数组中,然后在循环遍历数组时将它们传递给addEvent()构造。

我已经能够解决一半的问题了。我使用Long.parseLong将文本文件中的String delayTime值转换为long类型,并将其传递给Event构造,如下所示:

   addEvent(ThermostatNight(y)); // Where y = the converted long type delayTime 

现在我只需要弄清楚如何将String事件类型从文本文件(例如ThermostatNight)转换为Event类型,以便addEvent方法将接受它:

   addEvent(x(y)) // x = Event value; y = long value

Class.forName会为此工作吗?我试图在数组中保存的事件上使用它,但我得到了ClassNotFoundException。以下是一段代码,展示了我要做的事情:

for(String e2 : array2){
    try{
        Class<?> className = Class.forName(e2);
        System.out.println(className);          
    } catch (ClassNotFoundException e) {
        System.out.println("Class not found");
    }
}

2 个答案:

答案 0 :(得分:1)

是的,Class.forName应该在这里工作。

1)这里e2应该像“package1.package2.ThermostatNight”,即完全
合格的班级名称。此外,该代码应该可用于此代码 加载的运行时(因此,类必须以编译的形式存在,你知道,
在jar文件中或类路径中的类目录中。)
2)加载课程后,您需要找到并拨打正确的班级 构造函数(具有长参数的构造函数)通过​​反射 http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary.html
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html

3)addEvent参数的声明类型是什么?
如果它是ThermostatNight(而不是对象),那么您将需要
将您创建的对象(从动态加载的类)转换为
ThermostatNight意味着您需要使用ThermostatNight
在编译时,所以你应该没有问题1)作为
这类课程的存在与否变得可见 在编译时。

答案 1 :(得分:1)

另一种没有反射的解决方案(由于避免反射的原因很多)是使用工厂模式来解决这个问题。

您的工厂类可能如下所示(假设EventThermostatNight AnotherEventClass 的接口或抽象类:

public class EventFactory {
    public static Event createSpecificEvent(String eventName, long delayTime) {
        Event event;

        switch (eventName) {  // String switch-case statements since Java 7
        case "ThermostatNight":
            event = new ThermostatNight(delayTime);
            break;
        case "AnotherEventClass":
            event = new AnotherEventClass(delayTime);
            break;
        default:
            throw new IllegalArgumentException("Unknown event type.");
        }

        return event;
    }
}

并且这样称呼:

long y = 1234;

for (String e2 : array2) {
    Event event = EventFactory.createSpecificEvent(e2, y);
    System.out.println(event.getClass().getName());
}