望月烈羽 2017-10-23 03:02 采纳率: 0%
浏览 560

请教个rmi 动态类加载 问题

客户端设了securitymanager,服务端设了java.rmi.server.codebase, http://127.0.0.1:8080/ 是有类文件的,通过浏览器能访问到
但是当我启动HelloServer后,再启动HelloClient,客户端就报错
java.lang.ClassNotFoundException: rmi.Client
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler$Loader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClassForName(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy0.login(Unknown Source)
at rmi.HelloClient.main(HelloClient.java:36)

rmi.Client是远程调用返回的可序列化的类

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 01:56
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由RMI(远程方法调用)和Java的Security Manager机制引起的。在你的环境中,由于安全策略,你可能无法直接从非本地系统加载类。如果你的服务器端代码库包含了一个可以被其他系统的类,那么你应该确保它有一个有效的JAR文件,并且这个JAR文件应该在你的服务器上。

    以下是一个简单的例子:

    public class HelloClient {
        public static void main(String[] args) throws Exception {
            // 创建一个远程对象实例
            Client client = new Client();
            
            // 调用远程对象的方法
            String result = client.sayHello("World");
            
            System.out.println(result);
        }
    }
    

    在这个例子中,我们创建了一个Client类的远程对象实例。然后我们使用sayHello方法并打印出结果。注意,这里的sayHello方法是远程调用返回的可序列化的类。

    关于java.security.AccessController.doPrivileged,这是一个Java Security API的安全API,用于处理具有权限检查的请求。如果在运行时没有安全策略,则此方法将不执行任何操作。

    对于sun.rmi.server.LoaderHandler$Loader.loadClass,这是RMI的内部方法,负责查找和加载类。这通常发生在服务器端,因为服务器端通常会拥有更多的控制权。

    至于sun.rmi.server.MarshalInputStream.resolveClass,这是RMI的一个内部方法,用于解析输入流中的数据。这通常是服务器端进行数据传输的地方。

    最后,sun.rmi.server.UnicastRef.unmarshalValuesun.rmi.server.UnicastRef.invoke都是RMI的内部方法,用于处理远程调用。这些方法通常是在服务器端使用的,因为它们涉及到数据传输和消息传递。

    总的来说,要解决这个问题,你需要确保你的类已经被编译成一个JAR文件,并且这个JAR文件被正确地部署到了服务器上。此外,你也需要确保你的客户端能够获取到这个JAR文件。

    评论

报告相同问题?