gpt4 book ai didi

java - 使用bytearray加载jar,找不到嵌套类

转载 作者:行者123 更新时间:2023-11-30 06:15:53 25 4
gpt4 key购买 nike

想法

我在 byte[] 中有一个 jar (postgresql-9.4.1208.jre7.jar)。我想在运行时加载、连接和运行一些基本的 SQL 命令。

实现

因此我创建了一个新的类加载器:

public class JarClassloader extends ClassLoader {

public interface DriverProblemReporter {
void reportDriverProblem(String name, Throwable e);
}

private final byte[] driverdata;

private final DriverProblemReporter problemReporter;

public JarClassloader(byte[] jar, String drivername, DriverProblemReporter reporter) {
super(ClassLoader.getSystemClassLoader());
this.problemReporter = reporter;

try {
JarInputStream jis = new JarInputStream(new ByteArrayInputStream(jar));
JarEntry entry = jis.getNextJarEntry();
while (entry != null) {
handleEntry(entry, jis);
entry = jis.getNextJarEntry();
}
} catch (IOException e) {
e.printStackTrace();
}

this.driverdata = jar;
}

private void handleEntry(JarEntry entry, JarInputStream jis) {
if (!entry.isDirectory()) {
ByteArrayOutputStream baos;
try {
baos = new ByteArrayOutputStream();
IOUtils.copy(jis, baos);
baos.flush();
} catch (IOException e) {
problemReporter.reportDriverProblem(entry.getName(), e);
return;
}
try {
defineClass(baos.toByteArray(), 0, baos.size());
} catch (LinkageError e) {
problemReporter.reportDriverProblem(entry.getName(), e);
}
}
}
}

Jar 加载成功,我能够获取驱动程序的实例。

兴趣点

在调用连接到数据库时,我收到此错误:

java.lang.NoClassDefFoundError: org/postgresql/hostchooser/HostRequirement$1
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:107)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:215)
at org.postgresql.Driver.makeConnection(Driver.java:406)
at org.postgresql.Driver.connect(Driver.java:274)

在堆栈跟踪中,我看到 org.postgresql.Driver 的工作实例正在寻找名为 org/postgresql/hostchooser/HostRequirement$1 的类。

假设

我的 JarClassloader 不加载匿名嵌套类。

问题

我该怎么做才能成功加载 jar 中的所有类?

最佳答案

您需要按照类加载器需要的顺序加载类,而不是按照它们在 JAR 文件中的顺序。因此,您需要重写 findClass() 方法并在此时搜索 JAR 文件以查找所请求的类。

使用文件会简单得多。

关于java - 使用bytearray加载jar,找不到嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49201533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com