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 目录。