Нужно загрузить какой-нибудь класс с помощью начальной загрузки Classloader - PullRequest
0 голосов
/ 06 марта 2011

У меня следующий сценарий:

У меня есть byte[], который содержит данные .class класса (загруженного из файловой системы)

И у меня есть еще одинbyte[] этого некоторого объекта этого класса, который ранее был Сериализован в какой-то другой поток.

Сначала загрузите byte[] файла .class с моим пользовательским загрузчиком классов, который:

public class MainSearchClassLoader extends ClassLoader
{

    public MainSearchClassLoader()
    {
        super(MainSearchClassLoader.class.getClassLoader());
    }

    public Class<?> findClass(String name) throws ClassNotFoundException
    {
        try
        {
            byte[] bytecode = FileUtil.readClassByteCode();
            return super.defineClass(ReflectionUtil.getStubBinaryClassName() , bytecode, 0, bytecode.length);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

Затем я пытаюсь десериализовать этот экземпляр, используя следующий код:

public static Object getObjectFromBytes(final byte[] bytes)
    {
        Object object = null;
        try
        {
            object = new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
        } catch (final Exception ioe)
        {
            ioe.printStackTrace();
        }
        return object;
    }

, который принимает сериализованные байты и должен вернуть экземпляр (предварительно загруженного класса, используя мой пользовательский классзагрузчик) .. Я получил следующее исключение:

11/03/06 14:23:27 oracle.classloader.util.AnnotatedClassNotFoundException: 

      Missing class: mainSearchObjects.dc_index

    Dependent class: java.io.ObjectInputStream
             Loader: jre.bootstrap:1.5.0_06
        Code-Source: unknown
      Configuration: jre bootstrap

This load was initiated at MainSearch.web.MainSearch:0.0.0 using the Class.forName() method.

The missing class is not available from any code-source or loader in the system.
11/03/06 14:23:27   at oracle.classloader.PolicyClassLoader.handleClassNotFound (PolicyClassLoader.java:2068) [/D:/jdevstudio10134/j2ee/home/lib/pcl.jar (from system property java.class.path), by sun.misc.Launcher$AppClassLoader@14916158]
    at oracle.classloader.PolicyClassLoader.internalLoadClass (PolicyClassLoader.java:1679) [/D:/jdevstudio10134/j2ee/home/lib/pcl.jar (from system property java.class.path), by sun.misc.Launcher$AppClassLoader@14916158]
    at oracle.classloader.PolicyClassLoader.loadClass (PolicyClassLoader.java:1635) [/D:/jdevstudio10134/j2ee/home/lib/pcl.jar (from system property java.class.path), by sun.misc.Launcher$AppClassLoader@14916158]
    at oracle.classloader.PolicyClassLoader.loadClass (PolicyClassLoader.java:1620) [/D:/jdevstudio10134/j2ee/home/lib/pcl.jar (from system property java.class.path), by sun.misc.Launcher$AppClassLoader@14916158]
    at java.lang.ClassLoader.loadClassInternal (ClassLoader.java:319) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.lang.Class.forName0 (Native method) [unknown, by unknown]
    at java.lang.Class.forName (Class.java:242) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.resolveClass (ObjectInputStream.java:574) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1538) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1460) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1693) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1299) [jre bootstrap, by jre.bootstrap:1.5.0_06]
    at java.io.ObjectInputStream.readObject (ObjectInputStream.java:339) [jre bootstrap, by jre.bootstrap:1.5.0_06]
...........

Я понял это ... Загрузчик класса начальной загрузки, который используется кодом десеризации, не может видеть класс, загруженный одним из его дочерних элементов (мой классзагрузчик) и я думаю, что это правильное поведение, не так ли?

Итак, разве это не решение этой проблемы ??

1 Ответ

1 голос
/ 06 марта 2011

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4340158

Вам нужен собственный ObjectInputStream.

...