我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?
你可以储存你的钱。将数据库中的文件作为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()方法工作。