用于运行时和构建设置的Eclipse类路径,用于执行反射

时间:2016-04-08 23:54:16

标签: java eclipse

我有一个学校作业,教师提供了两个.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文件,并将其添加到类路径中。此外,从错误消息中您可以看到,在调用从框架获取方法之前,这不会导致错误。正如您所看到的,构造函数对框架中常量的调用工作正常。

非常感谢正确方向上的任何一点。

修改新信息

通过调试器运行代码后,我可以看到声明的公共字段被初始化为框架中的十个字段,但是,声明的公共方法没有被初始化。

0 个答案:

没有答案