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

Java Eclipse运行时类路径和用于执行反射的构建设置,java,eclipse,Java,Eclipse,我有一个学校作业,老师提供了两个.class文件来做一些基本的事情,比如模拟读写数据库和网络输入。不幸的是,这些类被保留在默认包中,这使我无法拥有目录结构。我想允许目录结构,它需要包,所以我使用反射来加载类和调用方法。不幸的是,我得到了一个错误: Exception in thread "main" java.lang.NoClassDefFoundError: Reservation at java.lang.Class.getDeclaredMethods0(Native Metho

我有一个学校作业,老师提供了两个.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); 
    }
}
私有静态类框架;
私有框架控制器(){
//Class.forName(“Framework”).getMethod(“someMethod”).invoke(null);
试一试{
frameWork=Class.forName(“frameWork”);
aval=新可用性(frameWork.getField(“NUM_SINGLE_ROOMS”).getInt(null),
Class.forName(“Framework”).getField(“NUM_DOUBLE_ROOMS”).getInt(null));
}捕获(IllegalArgumentException | IllegalAccessException
|NoSuchFieldException | SecurityException
|ClassNotFounde(异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
//初始化框架以从给定文件读取指令
公共静态void initialize(字符串文件名)引发IllegalAccessException、IllegalArgumentException、,
InvocationTargetException、NoSuchMethodException、SecurityException、ClassNotFoundException{
System.out.println(“读取输入文件”);
Path currentRelativePath=Path.get(“”);
字符串s=currentRelativePath.toAbsolutePath().toString();
System.out.println(“当前相对路径为:”+s);
frameWork.getMethod(“init”).invoke(文件名);
while((布尔)Class.forName(“框架”)
.getMethod(“hasNextInstruction”).invoke(null)){
//从框架中获取下一条指令的指令数据
String[]instructionData=(String[])Class.forName(“框架”).getMethod(“nextInstruction”).invoke(null);
//每条指令的第一行包含指令编号
int指令=Integer.parseInt(指令数据[0]);
//将指令的处理传递给其他函数
手动指令(指令、指令数据);
}
}
我相信这一定是我的运行时类路径的问题,但是我已经从提供的类文件创建了一个jar文件,并将其添加到类路径中。此外,从错误消息中可以看出,在调用从框架获取方法之前,这不会导致错误。正如您所看到的,从框架中调用常量的构造函数工作正常

正确方向上的任何一点都是值得赞赏的

编辑新信息


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

这很有趣
Reservation
似乎是
Framework
引用的类,但在加载
Framework
时未加载该类。。。(您提到了两个类,所以
Framework
是一个,而
Reservation
是另一个,不是吗?)并查看是否有效。我的意思是,我认为,
forName
还应该加载您传递给它的类所引用的类,但它似乎没有这样做。希望更熟悉这一技术的人能看到你的问题。保留课程不是教授包含的课程文件的一部分,它是我写的一个足够奇怪的课程。。。特别是框架使用的类。这可能是因为框架已经编译好了吗?嗯,对我来说奇怪的是它被
getMethod
抛出。我甚至不知道发生这种事的实际情况。没有记录。。。我在谷歌上搜索了一下,发现如果类加载失败,例如,
异常InInitializeRerror
,就会发生这种情况。例如,这意味着您在
Reservation
中有一个引发异常的
static{…}
块或静态字段初始值设定项。但是我认为
异常InInitializeError
应该由
类抛出。如果是这样的话,forName
可能还缺少一件事。默认包中的框架及其使用的保留类位于不同的包中。所以我确信这会导致一个错误。这是一个非常有趣的例子。因为我不熟悉这种反射的东西。事实证明。问题在于类不在正确的包中。为了解决这个问题,我将这些类移动到默认包中,制作了一个包含所有需要的文件的jar,并将其添加到类路径中。谢谢你的帮助!那很有趣
Reservation
似乎是
Framework
引用的类,但在加载
Framework
时未加载该类。。。(您提到了两个类,所以
Framework
是一个,而
Reservation
是另一个,不是吗?)并查看是否有效。我的意思是,我认为,
forName
还应该加载您传递给它的类所引用的类,但它似乎没有这样做。希望更熟悉这一技术的人能看到你的问题。保留课程不是教授包含的课程文件的一部分,它是我写的一个足够奇怪的课程。。。特别是框架使用的类。这可能是因为框架已经编译好了吗?嗯,对我来说奇怪的是它被
getMethod
抛出。我甚至不知道发生这种事的实际情况。没有记录。。。我做了一个李