如何解决类<>在默认的类加载器中从网络接收的对象?

时间:2011-02-24 18:47:56

标签: java serialization reflection classloader

我正在发送一个Class<>通过网络对象。

现在,当我收到另一方的对象时,我希望能够将它加载到当前的类加载器中。问题是,似乎唯一可以完成工作的方法是保护(resolveClass(Class<?> c))。因此,要使用它,我必须扩展默认的类加载器。

那么,有没有更简单的方法呢?

约束:不幸的是,我无法写入服务器的磁盘,因此发送.class文件而不是对象的明显解决方案是不可行的。

1 个答案:

答案 0 :(得分:1)

当您使用Class.forName(className)时,它会解析该类。您还可以将ClassLoader.loadClass(classname)用于特定的类加载器。

将类加载到类加载器中的唯一方法是获取该类的字节代码。这仅适用于之前未加载此名称的类。您可以通过使用反射调用ClassLoader.defineClass()来强制类加载器从字节代码加载类。

您可以从类加载器中获取字节代码

byte[] bytes = IOUtils.toByteArray(
     myClass.getClassLoader().getResourceAsInputStream(
         myClass.getName().replace('.','/')+".class"));

注意:要加载一个类,必须首先加载所有依赖项。如果所有依赖项都可用,这很容易,但如果需要提取更多类,则会变得更复杂。