【问题标题】:Dynamically loading a class at the Client side program在客户端程序中动态加载一个类
【发布时间】:2019-08-02 04:47:02
【问题描述】:

我正在处理client-server 应用程序,作为我课程作业的一部分。该程序基本上只是计算素数,gcd等。

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

有一个名为 Contractfolder 包含用于计算素数、gcd 和 pi 的计算任务类。

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

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

我该如何解决这个问题?

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

public boolean checkIfFileExists(String classFile){

    String path = "./src/Server/Contract/"+classFile+".java";
    String classF = "Server.Contract."+classFile;
    File file = new File(path);

    if(file.exists()){
        try{
            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            Class cls = classLoader.loadClass(classF);
            Object obj = cls.newInstance();

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
        } 
        //catch (MalformedURLException ex) {
        //}
        return true;
    }
    else{
        return false;
    }
}

基本上我期望这个方法做的是如果文件存在则返回true并加载类,然后服务器执行我的代码的其余部分,如果它不存在则返回false。

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

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

作业要求: " 但是,当发生异常时(例如,计算客户端想要计算服务器 执行计算任务,但忘记将计算任务的 Java 类上传到 计算服务器的类存储库,计算服务器将创建一个 CSMessage 对象 并将其发送回计算客户端。注意:CSMessage 遵循交互契约 通过实现Task接口。通过调用 getResult() 方法,computeclient 将知道问题并在以后修复它。”

【问题讨论】:

  • 每当我尝试在 Netbeans 中创建一个新类时,它都会将其保存为 .java 文件。这样可以吗?
  • @OP 如果您想为您的问题添加更多内容,只需编辑原始内容并添加即可。它会在 cmets 中丢失。
  • 为什么类一开始就没有服务端应用?
  • @flakes 我下次会这样做
  • @lalitmehra 我不确定。出于某种原因,Netbeans 在“Build”文件夹下创建了 .class 文件。如果我将 .java 文件重命名为 .class 文件,我会在客户端代码中遇到导入错误

标签: java exception error-handling server


【解决方案1】:

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

【讨论】:

  • 有没有办法通过代码而不是使用cmd来编译和加载类?不能准确地告诉我的教授在批改我的作业时编排课程
  • 即使有办法通过代码编译和加载类,你为什么要这样做。只需正确编译源代码文件并在运行客户端应用程序之前检查其 .class 文件是否可用
  • 如果你真的想编译代码 - 看看:stackoverflow.com/questions/21544446/…
  • @AndrzejJaromin 我已经发布了关于我为什么需要这样做的分配要求
【解决方案2】:

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

【讨论】:

  • 我想你的意思是我的客户端程序。是的,我需要它表现得那样。在我的作业中,据说如果用户在没有确保所有类都可用的情况下启动程序,则服务器应该抛出客户端应该显示的错误
  • 在这种情况下 ComputePi 类存在但该类存在编译错误,必须正确编译才能加载而不会出现任何错误。要么编译类文件,要么把文件内容粘贴到这里检查错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多