Java RMI解组异常

Java RMI解组异常,java,classloader,rmi,Java,Classloader,Rmi,我目前正在开发一个通过rmi加载类的系统。该系统使用与服务器通信的类加载器来获取类。代码如下 服务器: import rocks.squareRock; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class Server extends UnicastRemoteObject implements Rem

我目前正在开发一个通过rmi加载类的系统。该系统使用与服务器通信的类加载器来获取类。代码如下

服务器:

import rocks.squareRock;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server extends UnicastRemoteObject
        implements RemInterface {

    public Server() throws RemoteException {
        super();
    }

    public static void main(String argv[]) {
        try {
            Server serv = new Server();
            Naming.rebind("RockServer", serv);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public Class<?> getRockClass(String type) {
        if (type.equals("squareRock"))
            return squareRock.class;
        else
            return null;
    }
}
接口:

public interface RemInterface {
    public Class<?> getRockClass(String type) throws RemoteException;
}

这让我很困惑,因为我不是在解包SquareRock实例,而是在解包一个类。我唯一的想法是我的类加载器可能是错的。

不管它是类还是对象。接收JVM的类路径中必须有该类,除非您使用的是RMI代码基特性。您所做的基本上是尝试自己实现代码库特性。你不能那样做。

不管它是类还是对象。接收JVM的类路径中必须有该类,除非您使用的是RMI代码基特性。您所做的基本上是尝试自己实现代码库特性。您不能这样做。

可能重复的+1的可能重复。传输的类对象只包含类名(可能还有代码基URI),而不包含类的字节码。可以实现一些方案,其中RMI流包含整个字节码并从中加载类,但这需要客户端和服务器端的合作(发送端的类加载器必须允许访问活动类的字节码)。您能看一下这个问题吗?+1。传输的类对象只包含类名(可能还有代码基URI),而不包含类的字节码。我们可以实现一些方案,其中RMI流包含整个字节码并从中加载类,但这需要客户端和服务器端的合作(发送端的类加载器必须允许访问活动类的字节码)。您可以看看这个问题吗?
public interface RemInterface {
    public Class<?> getRockClass(String type) throws RemoteException;
}
import java.io.Serializable;

public class RockLoader extends ClassLoader implements Serializable {

    private RemInterface reminterface = null;

    public RockLoader(RemInterface reminterface) {
        super();
        this.reminterface = reminterface;
    }

    @Override
    protected synchronized Class<?> loadClass(String className, boolean resolve)
            throws ClassNotFoundException {
        try {
            return reminterface.getRockClass(className);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: SquareRock