我有一个学校作业,教师提供了两个.class文件来做一些基本的事情,比如模拟阅读和写入数据库以及进行网络输入。不幸的是,这些类保留在默认包中,这使我无法使用目录结构。我想允许一个目录结构,这需要包,所以我使用反射来加载类和调用方法。不幸的是,我收到了一个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Reservation
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getMethod0(Class.java:2937)
at java.lang.Class.getMethod(Class.java:1771)
at framework_proxy.FrameWorkController.initialize(FrameWorkController.java:54)
at framework_proxy.Main.main(Main.java:12)
以下是有问题的方法:
private static Class<?> frameWork;
private FrameWorkController() {
//Class.forName("Framework").getMethod("someMethod").invoke(null);
try {
frameWork = Class.forName("Framework");
aval = new Availabilities(frameWork.getField("NUM_SINGLE_ROOMS").getInt(null),
Class.forName("Framework").getField("NUM_DOUBLE_ROOMS").getInt(null));
} catch (IllegalArgumentException | IllegalAccessException
| NoSuchFieldException | SecurityException
| ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Initialize the framework to read instructions from the given file
public static void initialize(String fileName) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException {
System.out.println("Reading input file");
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current Relative Path is: " + s);
frameWork.getMethod("init").invoke(fileName);
while ((boolean) Class.forName("Framework")
.getMethod("hasNextInstruction").invoke(null)) {
//get the instruction data for the next instruction from the framework
String[] instructionData = (String[]) Class.forName("Framework").getMethod("nextInstruction").invoke(null);
//the first line of every instruction contains the instruction number
int instruction = Integer.parseInt(instructionData[0]);
//pass off the handling of the instruction to a different function
handleInstruction(instruction, instructionData);
}
}
我认为这必须是我的运行时类路径的一个问题,但是我已经从我提供的类文件中创建了一个jar文件,并将其添加到类路径中。此外,从错误消息中您可以看到,在调用从框架获取方法之前,这不会导致错误。正如您所看到的,构造函数对框架中常量的调用工作正常。
非常感谢正确方向上的任何一点。
修改新信息
通过调试器运行代码后,我可以看到声明的公共字段被初始化为框架中的十个字段,但是,声明的公共方法没有被初始化。