我有以下情况:
我有一个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]
...........
我明白了..解除代码所使用的bootstrap类加载器无法看到其子类之一(我的类加载器)加载的类,我认为这是正确的behaiour,不是吗?
那么,这不是解决这个问题的方法吗?
答案 0 :(得分:1)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4340158
您需要自己的ObjectInputStream。