Java 工具集教程

rmic.exe 生成远程对象的stub和skeleton

rmic.exe 是 Java 开发工具包(JDK)中的一个工具,用于生成远程对象的存根(stub)和骨架(skeleton),以便在远程方法调用(RMI)中进行通信。

命令语法

rmic <options> <class names>

命令选项

其中 <options> 包括:

  • -keep  不删除临时生成的源文件

  • -keepgenerated  (与 "-keep" 相同)

  • -v1.1  创建 1.1 存根协议版本的存根/骨架 (已过时)

  • -vcompat  创建与 1.1 和 1.2 存根协议版本,都兼容的存根/骨架 (已过时)

  • -v1.2  (默认值) 仅创建 1.2 存根协议版本的存根 (已过时)

  • -iiop  创建 IIOP 的存根。如果提供, <options> 还包括:

    • -always  创建存根 (即使当前显示)

    • -alwaysgenerate  (与 "-always" 相同)

    • -nolocalstubs  不创建对相同进程优化的存根

  • -idl  创建 IDL。如果提供, <options> 还包括:

    • -noValueMethods  不为值类型生成方法

    • -always  创建 IDL (即使当前显示)

    • -alwaysgenerate  (与 "-always" 相同)

  • -g  生成调试信息

  • -nowarn  不生成任何警告

  • -nowrite  不将编译的类写入文件系统

  • -verbose  输出有关编译器正在执行的操作的消息

  • -classpath <path>  指定查找输入类文件的位置

  • -bootclasspath <path>  覆盖引导类文件的位置

  • -extdirs <path>  覆盖所安装扩展的位置

  • -d <directory>  指定放置生成的类文件的位置

  • -J<runtime flag>  将参数传递给 java 解释器

命令示例

在运行示例前,先把 RMI 入门示例 的 class 文件拷贝到 D:\share_dir\ShareDoc 目录下面,例如:

D:\share_dir\ShareDoc> tree /A /F com 
卷 软件 的文件夹 PATH 列表
卷序列号为 000000EB EAE2:F5C2
D:\SHARE_DIR\SHAREDOC\COM
\---hxstrive
    \---rmi
            HelloClient.class
            HelloServer.class
            HelloServer2.class
            User.class
            UserService.class
            UserServiceImpl.class

(1)使用 rmic 生成 UserServiceImpl 类的 RMI 骨架及静态存根

D:\share_dir\ShareDoc> rmic com.hxstrive.rmi.UserServiceImpl
警告: 为 JRMP 生成和使用骨架及静态存根
已过时。骨架不再必要, 而静态存根
已由动态生成的存根取代。建议用户
不再使用rmic来生成骨架和静态存根。
请参阅 java.rmi.server.UnicastRemoteObject 的文档。

D:\share_dir\ShareDoc> tree /A /F com 
卷 软件 的文件夹 PATH 列表
卷序列号为 000000EB EAE2:F5C2
D:\SHARE_DIR\SHAREDOC\COM
\---hxstrive
    \---rmi
            HelloClient.class
            HelloServer.class
            HelloServer2.class
            User.class
            UserService.class
            UserServiceImpl.class
            UserServiceImpl_Stub.class

注意:命令执行完成后,多了一个 UserServiceImpl_Stub.class 文件,这就是生成的骨架及静态存根。反编译后内容如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.hxstrive.rmi;

import java.lang.reflect.Method;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.UnexpectedException;
import java.rmi.server.RemoteRef;
import java.rmi.server.RemoteStub;

public final class UserServiceImpl_Stub extends RemoteStub implements UserService, Remote {
    private static final long serialVersionUID = 2L;
    private static Method $method_findUser_0;

    static {
        try {
            $method_findUser_0 = (class$com$hxstrive$rmi$UserService != null ? class$com$hxstrive$rmi$UserService : (class$com$hxstrive$rmi$UserService = class$("com.hxstrive.rmi.UserService"))).getMethod("findUser", class$java$lang$String != null ? class$java$lang$String : (class$java$lang$String = class$("java.lang.String")));
        } catch (NoSuchMethodException var0) {
            throw new NoSuchMethodError("stub class initialization failed");
        }
    }

    public UserServiceImpl_Stub(RemoteRef var1) {
        super(var1);
    }

    public User findUser(String var1) throws RemoteException {
        try {
            Object var2 = super.ref.invoke(this, $method_findUser_0, new Object[]{var1}, -8959371717082996187L);
            return (User)var2;
        } catch (RuntimeException var3) {
            throw var3;
        } catch (RemoteException var4) {
            throw var4;
        } catch (Exception var5) {
            throw new UnexpectedException("undeclared checked exception", var5);
        }
    }
}

(2)使用 -d 选项指定生成的骨架及静态存根输出目录

D:\share_dir\ShareDoc> rmic -d out com.hxstrive.rmi.UserServiceImpl
警告: 为 JRMP 生成和使用骨架及静态存根
已过时。骨架不再必要, 而静态存根
已由动态生成的存根取代。建议用户
不再使用rmic来生成骨架和静态存根。
请参阅 java.rmi.server.UnicastRemoteObject 的文档。

D:\share_dir\ShareDoc> tree /A /F out
卷 软件 的文件夹 PATH 列表
卷序列号为 000000BE EAE2:F5C2
D:\SHARE_DIR\SHAREDOC\OUT
\---com
    \---hxstrive
        \---rmi
                UserServiceImpl_Stub.class

上面例子中,骨架及静态存根输出到了 D:\share_dir\ShareDoc\out 目录。 

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号