java.rmi.UnmarshalException:错误解组返回;嵌套的异常是:java.lang.ClassNotFoundException: [英] java.rmi.UnmarshalException: error unmarshalling return; nested exception is:java.lang.ClassNotFoundException:

查看:115
本文介绍了java.rmi.UnmarshalException:错误解组返回;嵌套的异常是:java.lang.ClassNotFoundException:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下情况:

使用RMI,我注意到在特定情况下,RMI客户端没有通过RMI发送其实例的类.因此,我以Byte []的形式发送了该类,然后使用我定义的类加载器加载了该类.

Using RMI, i noticed that under a specific situation, the RMI client did not have the class whose instance was sent via RMI. So, I sent the class in the shape of Byte [] and then loaded it with a class loader i defined.

客户端中的代码如下:

pp = plugins.getPanelClasses(); //RMI method
panelClassLoader pcl = new panelClassLoader(); //simple class loader defined by me
String name = pcl.defineClass(pp);

然后,我在客户端询问所加载类的实例:

Then, i ask in the client side by the instance of the class loaded:

HashMap<String, PluginPanel> panels = null;
try
{
panels = plugins.getSettingsPanels();
} catch (RemoteException ex)
{
    Logger.getLogger(ServerOptions.class.getName()).log(Level.SEVERE, null, ex);
}

PluginPanel是一个接口,其实现类并不总是在客户端中...

PluginPanel is an interface whose implementing classes are not always in the client...

和类加载器是:

private class panelClassLoader extends ClassLoader
{

    public panelClassLoader(ClassLoader parent)
    {
        super(parent);
    }

    public panelClassLoader()
    {
        super(getSystemClassLoader());
    }

    public String defineClass(byte[] b)
    {
        Class c = super.defineClass(null, b, 0, b.length);

        resolveClass(c);

        return c.getName();
    }
}

尽管如此,我仍然遇到以下错误:java.rmi.UnmarshalException:错误解组返回;嵌套的异常是:java.lang.ClassNotFoundException:pt.ua.dicoogle.IndexPlugin.CPanel(无安全管理器:禁用RMI类加载器)在sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)在java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)在java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)在$ Proxy22.getSettingsPanels(未知来源)在pt.ua.dicoogle.rGUI.client.windows.ServerOptions.(ServerOptions.java:176)

Nevertheless, I'm stuck with the following error: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (no security manager: RMI class loader disabled) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) at $Proxy22.getSettingsPanels(Unknown Source) at pt.ua.dicoogle.rGUI.client.windows.ServerOptions.(ServerOptions.java:176)

由以下原因引起:java.lang.ClassNotFoundException:pt.ua.dicoogle.IndexPlugin.CPanel(无安全管理器:禁用RMI类加载器)在sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)在sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)在java.rmi.server.RMIClassLoader $ 2.loadClass(RMIClassLoader.java:620)在java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)在sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)在java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)在java.util.HashMap.readObject(HashMap.java:1030)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang.reflect.Method.invoke(Method.java:597)在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)在sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)在sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)

Caused by: java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (no security manager: RMI class loader disabled) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165) at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620) at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247) at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at java.util.HashMap.readObject(HashMap.java:1030) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)

有任何建议吗?

推荐答案

您必须在该类加载器的上下文中调用远程方法.这不是一个好的计划.很好地了解RMI代码库功能,它是专门为这种情况而设计的.

You would have to call the remote method in the context of that class loader. Not a good scheme. Have a good look at the RMI codebase feature, it is designed for exactly this situation.

这篇关于java.rmi.UnmarshalException:错误解组返回;嵌套的异常是:java.lang.ClassNotFoundException:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆