Java 在客户端程序中动态加载类

Java 在客户端程序中动态加载类,java,exception,error-handling,server,Java,Exception,Error Handling,Server,作为课程作业的一部分,我正在开发一个客户端服务器应用程序。该程序基本上只是计算素数、gcd等 客户端是GUI,服务器端处理请求并执行计算 有一个名为Contract的类,它保存计算素数、gcd和pi的计算任务类 用户单击“计算”按钮,向服务器发送请求,以检查文件夹中是否有相应的计算类。如果找到,则服务器使用父接口“Task”进行计算,并将结果发送回客户端。如果文件不在那里,那么服务器将向客户端发送一条错误消息 但我的问题是: 在我之前的SO问题的帮助下,我已设法检查该文件是否存在。现在,如果在执

作为课程作业的一部分,我正在开发一个
客户端服务器
应用程序。该程序基本上只是计算素数、gcd等

客户端是GUI,服务器端处理请求并执行计算

有一个名为
Contract
的类,它保存计算素数、gcd和pi的计算任务类

用户单击“计算”按钮,向服务器发送请求,以检查文件夹中是否有相应的计算类。如果找到,则服务器使用父接口“Task”进行计算,并将结果发送回客户端。如果文件不在那里,那么服务器将向客户端发送一条错误消息

但我的问题是:
在我之前的SO问题的帮助下,我已设法检查该文件是否存在。现在,如果在执行服务器和客户端程序之前,文件夹中没有该文件,那么当我尝试在服务器端动态加载该类时,我会在客户端得到它。此外,如果文件不在文件夹中,用户必须将文件上载到文件夹中,然后如果服务器看到它在那里,则必须在运行时加载类文件

我如何解决这个问题

用于检查文件是否存在和加载类的服务器端代码:

public boolean checkIfFileExists(字符串类文件){
字符串路径=“./src/Server/Contract/”+classFile+“.java”;
字符串classF=“Server.Contract.”+类文件;
文件=新文件(路径);
if(file.exists()){
试一试{
ClassLoader ClassLoader=ClassLoader.getSystemClassLoader();
Class cls=classLoader.loadClass(classF);
Object obj=cls.newInstance();
}catch(ClassNotFoundException |实例化Exception | IllegalacessException ex){
} 
//捕获(格式错误){
//}
返回true;
}
否则{
返回false;
}
}
基本上,我希望这个方法在文件存在时返回true并加载类,然后服务器执行代码的其余部分,如果不存在则返回false

p.S.服务器和客户端运行在同一台机器上,服务器是本地主机

在服务器加载类之后,如何让客户端使用该类?另外,我正在使用Netbeans和JDK1.8i,这很有帮助。这些是我的课程使用的

任务要求: “但是,当发生异常时(例如,计算客户端需要计算服务器 执行计算任务,但忘记将计算任务的Java类上载到 类存储库,计算服务器将创建CSMessage对象 并将其发送回计算客户端。注意:CSM消息遵循交互约定
通过实现任务接口。通过调用getResult()方法,computeclient将知道问题并在以后解决。”

Netbeans似乎会编译代码,即使有错误,然后在运行时抛出RuntimeException,在这种情况下,ComputePi类可能有错误。所以需要检查类的源代码。您可以将源代码粘贴到此处进行检查。

您应该加载已编译的类,而不是源代码。在将类上载到服务器之前,请尝试编译该类,然后发送由编译器生成的
*.class
文件,而不是
*.java
文件。 可以使用命令行编译器编译该类:
javacmyclass.java
-它将在同一目录中生成编译后的
MyClass.class
文件(或者从IDE中使用compile/build命令,并在IDE的输出目录中查找编译后的类-我正在使用IntelliJ/Eclipse,因此我不确定它将在NetBeans中出现哪一个).

每当我尝试在Netbeans中创建新类时,它都会将其保存为.java文件。这样可以吗?@OP如果您想在问题中添加更多内容,只需编辑原始内容并添加即可。评论中会漏掉它。为什么这个类一开始就没有服务器应用程序?@flakes我下一步会这么做time@lalitmehra我不确定。出于某种原因,Netbeans在“Build”文件夹下创建.class文件。如果我将.java文件重命名为.class文件,那么在客户端代码中会出现导入错误。有没有办法通过代码而不是使用cmd来编译和加载类?当我的教授标记我的作业时,不能确切地告诉他编译类即使有一种方法可以通过代码编译和加载类,你为什么要这样做。只需正确编译源代码文件,并在运行客户端应用程序之前检查.class文件是否可用。如果您真的想编译代码,请检查:@AndrzejJaromin我已经发布了分配要求,说明我为什么需要这样做。我想您指的是我的客户端程序。是的,我需要它这样做。在我的作业中说,如果用户启动程序时没有确保所有类都可用,服务器应该抛出一个客户端应该显示的错误。在这种情况下,ComputePi类存在,但该类有编译错误,则必须正确编译该类,以便在没有任何错误的情况下加载。编译类文件或将文件内容粘贴到此处以检查错误。