当前位置: 首页 > 知识库问答 >
问题:

从不同的文件系统加载类文件

汪翰墨
2023-03-14

我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?

共有1个答案

萧宁
2023-03-14

你可以储存你的钱。将数据库中的文件作为BLOB对象进行分类。您应该使用缓存,在一个简单的HashMap中跟踪您使用的所有类,以便您只能从数据库中检索每个类一次。

当委托的父类加载器抛出ClassNotFoundException时,必须执行从数据库检索类二进制文件的代码点。

@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
    Class cls = null;

    try {
        cls = parent.loadClass(name);           // Delegate to the parent Class Loader
    } catch (ClassNotFoundException clnfE) {    // If parent fails, try to locate and load the class
        byte[] bytes = new byte[0];
        try {
            bytes = loadClassFromDatabase(name);
        } catch (SQLException sqlE) {
            throw new ClassNotFoundException("Unable to load class", sqlE);
        }
        return defineClass(name, bytes, 0, bytes.length);
    }

    return cls;
}

您可以修改该方法,该方法检索类二进制文件。例如,您可以从数据库、ftp服务器、简单文件甚至简单的套接字连接检索类二进制文件。下面是一个示例,说明从数据库检索的类二进制文件;

private byte[] loadClassFromDatabase(String name) throws SQLException {
    PreparedStatement pstmt = null;
    Connection connection = null;

    try {
        connection = DriverManager.getConnection(connectionString);

        String sql = "SELECT CLASS FROM CLASSES WHERE CLASS_NAME = ?";
        pstmt = connection.prepareStatement(sql);
        pstmt.setString(1, name);
        ResultSet rs = pstmt.executeQuery();

        if (rs.next()) {
            Blob blob = rs.getBlob(1);
            byte[] data = blob.getBytes(1, (int) blob.length());
            return data;
        }
    } catch (SQLException e) {
        System.out.println("Unexpected exception: " + e.toString());
    } catch (Exception e) {
        System.out.println("Unexpected exception: " + e.toString());
    } finally {
        if (pstmt != null) {
            pstmt.close();
        }

        if(connection != null) {
            connection.close();
        }
    }

    return null;
}

检索类二进制文件的方法应该返回一个字节数组,然后类加载器使用defineClass(name,bytes,0,bytes.length)方法定义类。很明显,字节数组可以从数据库、套接字连接、文件读取器,。。。

我已经编写了一个在ApacheDerby上作为内存缓存运行的简单演示。你可以去看看;

https://github.com/bzdgn/simple-class-loader/blob/master/src/com/levent/classloader/DerbyServerClassLoader.java

以及整个演示项目;

https://github.com/bzdgn/simple-class-loader

 类似资料:
  • 问题内容: 我的项目设定 我有以下项目设置: 在我的代码中,我使用相对URL引用图像。 问题 如果我在目录中使用以下命令运行此程序: 然后一切正常,Java能够找到该图像。 现在,我的问题是,我需要能够从其他目录运行该程序。 该程序已执行,但是现在所有相对URL不再起作用。 我需要的 如何计算program.jar文件的执行位置,以便可以将相对URL更改为绝对URL? 问题答案: 如果可能的话,我

  • 问题内容: 我有一个简单的程序,需要显示图像。我知道如何从Eclipse运行代码,也知道如何从JAR文件运行,但是我想要一个在两种情况下都可以使用的解决方案。 Eclipse项目就是这样的: 可在Eclipse中运行的代码段: 适用于JAR的文件(全部在一个JAR文件中): 为了使单个代码在两种情况下都能正常工作,我需要更改什么? 问题答案: 将文件夹放在文件夹中,Eclipse会将图像复制到目标

  • 问题内容: 我认为,如果Java程序员这样做的时间足够长,就会遇到这种情况。您正在进行调试并更改类。当您重新运行该程序时,这些更改似乎没有被接受,但是旧类似乎仍在运行。您清理并重建所有内容,同样的问题。有时,这可能归结为类路径问题,同一类多次出现在类路径中,但是似乎没有一种简单的方法来确定要加载的类来自何处… 有什么方法可以找到已加载类的文件路径吗?如果从文件或文件中加载了类,则最好是可行的。有任

  • 问题内容: 这就是我自动加载文件夹中所有类的方式, 但是我的文件夹中也有类,我也想自动加载它们-我该怎么办?我应该复制上面的自动加载并仅将路径更改为(但是不是重复吗?)? 谢谢。 编辑: 这些是我在控制器文件夹中的类文件名: 这些是我在模型文件夹中的类文件名: 通常这就是我命名控制器类类的方式(我使用下划线和小写), 这通常是我为模型类类命名的方式(我使用下划线和小写), 问题答案: 您应该命名您

  • 我目前正在制作一个Minecraft Mod Loader。 正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类 因此,在调用startup时,我需要遍历mods文件夹中的每个Mo

  • 我可以使用Picasso库从文件系统加载图像吗? 我正在使用让用户从他的图库中选择一张照片,然后想要显示所选图像。 我已经有了获取图像文件系统Uri的工作代码,但无法获取毕加索。load()方法工作。