我有一个接受这样的事件的方法:
addEvent(Event event);
Event构造函数接受如下的long类型:
Event(long delayTime);
因此,我可以明确地将参数定义为addEvent
,如下所示:
addEvent(new ThermostatNight(2000)); //ThermostatNight=Event and 2000=delayTime
但是,我想从文本文件中提取Event
和delayTime
值,将它们保存在数组中,然后在循环遍历数组时将它们传递给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");
}
}
答案 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)
另一种没有反射的解决方案(由于避免反射的原因很多)是使用工厂模式来解决这个问题。
您的工厂类可能如下所示(假设Event
是ThermostatNight
和 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());
}