2011-10-20 9 views
0

私は次のような状況があります。RMIを使用してjava.rmi.UnmarshalException:エラーをアンマーシャリングしています。ネストされた例外がある:java.lang.ClassNotFoundExceptionが:

を、私は特定の状況の下で、RMIクライアントはそのインスタンスRMIを経由して送信されたクラスを持っていなかったことに気づきました。そこで、私はクラスをByte []の形で送り、定義したクラスローダーをロードしました。

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

PluginPanelが実装するインタフェースである。次に

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

は、私がロードされたクラスのインスタンスで、クライアント側に尋ねる:

クライアント側のコードが何かのようですクラスが常にクライアントにあるわけではありません。

クラスローダーは:

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クラスローダーが無効) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)でjava.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) pt.ua.で$ Proxy22.getSettingsPanels(不明なソース) で dicoogle.rGUI.client.windows.ServerOptions(ServerOptions.java:176)によって引き起こさ

:java.lang.ClassNotFoundExceptionが:pt.ua.dicoogle.IndexPlugin.CPanel(なしセキュリティマネージャ:RMIクラスローダ無効) 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:1574) .java:1328) at java.io.ObjectInputStream.readObject sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.javaでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)でjava.util.HashMap.readObject(HashMap.java:1030) で(ObjectInputStream.java:350) 。 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: (ObjectInputStream.java:1328) (java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)) a 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)

どのような摂取ですか?

答えて

1

リモートメソッドをそのクラスローダーのコンテキストで呼び出す必要があります。良い計画ではありません。 RMIコードベースの機能をよく見て、この状況に合わせて設計されています。

関連する問題