gpt4 book ai didi

Java自定义类加载器问题

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:13 24 4
gpt4 key购买 nike

我正在从客户端向服务器端发送一个类对象。每次服务器需要加载客户端发送的 Class 对象时,而不是通过父委托(delegate)模型重用它(在第一次迭代期间加载时)。

我正在尝试在服务器端使用自定义类加载器,其 loadClass(String)只需调用 findClass()而不是检查父层次结构。为此,我正在执行以下操作:

  1. 通过读取客户端的.class文件生成byte[]如下:
Class cl = com.example.XYZ.class;
String path = cl.getName().replace('.', '/') + ".class";
InputStream is = cl.getClassLoader().getResourceAsStream(path);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int data = -1;
while((data=is.read())!=-1)
bos.write(data);
byte[] classBinaryData = bos.toByteArray();

我正在发送 classBinaryData到服务器端。

  1. 在服务器端,每次我检索 byte[] ,通过匹配 MD5 校验和验证它是否与客户端相同,然后我创建自定义类加载器的新实例并传递字节数组,以便它可以用于调用 defineClass来自内部 findClass .

但是,我遇到了其中一个错误(取决于我从 .class 中创建 byte[] 的方式)

Incompatible magic value ..... in class file <Unknown>

com/example/XYZ (wrong name: com/example/XYZ)来自 defineClass

我需要帮助来找出我的方法/代码中的错误。

最佳答案

您的 byte[] 生成代码看起来不错。

当我使用从您的代码生成的字节数组通过以下类加载器代码加载类时,它能够成功加载类。

class CustomClassLoader extends ClassLoader {

public Class loadTheClass(String name, byte[] bytes) {

return defineClass(name, bytes, 0, bytes.length);
}
}

像这样使用这个类加载器

CustomClassLoader ccl = new CustomClassLoader();
Class cz = ccl.loadTheClass("com.example.XYZ", classBinaryData);
Object o = cz.newInstance();
  1. 我认为当您在服务器端加载类时,您必须在名称中使用 '.' 而不是 '/'
  2. 并确保字节数组数据未在您的其他代码中更改。

关于Java自定义类加载器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601251/

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