最近接触了一个C++项目,里面有个以.idl后缀的文件,于是查阅了一下,发现是CORBA技术的一部分,一个十分古老的技术,用作远程调用,现在都很少接触到,能查阅的资料也不是很多,后来发现java也支持这个技术,探索下做个笔记;
IDL(Interface description language)文件可以用idlj.exe转化成java文件,以供java调用,idlj.exe命令在jdk的bin目录下(jdk7到jdk10都有,jdk11移除了);
idlj.exe用法:
编译器用法:
java com.sun.tools.corba.se.idl.toJavaPortable.Compile [选项] <idl 文件>
其中, <idl 文件> 是包含 IDL 定义的文件的名称, 而
[选项] 是下列选项的任意组合。选项
是可选的, 并且显示顺序并不固定; <idl 文件> 是必需的,
并且必须显示在最后。
选项:
-d <符号> 这等同于 IDL 文件中的
下面一行: #define <符号>
-emitAll 发出所有类型, 包括在 #included 文件中找到的类型。
-f<side> 定义要发出哪些绑定。<side> 是 client,
server, all, serverTIE, allTIE 之一。serverTIE 和 allTIE
导致发出委派模型骨架。如果未使用
此标记, 将假定为 -fclient。
-i <包含路径> 默认情况下, 将在当前目录中扫描
包含的文件。此选项将添加另一个目录。
-keep 如果要生成的文件已存在, 请不要
覆盖它。默认情况下会覆盖它。
-noWarn 隐藏警告。
-oldImplBase 生成与旧版 (1.4 版之前) JDK ORB 兼容的骨架。
-pkgPrefix <t> <前缀> 当在文件范围内遇到类型或模块名 <t> 时,
在为 <t> 生成的所有文件的 Java 程序包名前
添加 <前缀>。
-pkgTranslate <t> <pkg> 当遇到类型或模块名 <t> 时, 在
生成的 Java 程序包中将其替换为 <pkg>。请注意,
将首先进行 pkgPrefix 更改。<t> 必须与
完整程序包名完全匹配。另外, <t> 不能为
org, org.omg 或 org.omg 的任何子程序包。
-skeletonName <xxx%yyy> 根据模式命名骨架。
默认值为:
%POA 表示 POA 基类 (-fserver 或 -fall)
_%ImplBase 表示 oldImplBase 基类
(-oldImplBase 和 (-fserver 或 -fall))。
-td <dir> 使用 <dir> 表示输出目录以代替
当前目录。
-tieName <xxx%yyy> 根据模式命名 tie。默认值为:
%POATie 表示 POA tie (-fserverTie 或 -fallTie)
%_Tie 表示 oldImplBase tie
(-oldImplBase 和 (-fserverTie 或 -fallTie))。
-v, -verbose 详细模式。
-version 显示版本号并退出。
还有个-fall参数比较重要(不知道为啥上面没介绍这个参数),-fall参数可以同时生成客户端和服务端代码,默认只生成客户端代码;
idl文件大概是这个样子:(module对应java的包路径,interface对应java的接口)(同样也用/*注释*/和//注释)

使用idlj命令生成:

生成这么多java类:

编程直接用到的类有接口类(用于接收接口引用)、Helper类(获取远程引用)、POA类(服务端用于实现接口);
生成的源码:_MyIStub.java
package idlpkg.objspkg;
/**
* idlpkg/objspkg/_MyIStub.java .
* 由IDL-to-Java 编译器 (可移植), 版本 "3.2"生成
* 从./test.idl
* 2021年4月21日 星期三 上午10时58分30秒 CST
*/
public class _MyIStub extends org.omg.CORBA.portable.ObjectImpl implements idlpkg.objspkg.MyI
{
public void test ()
{
org.omg.CORBA.portable.InputStream $in = null;
try {
org.omg.CORBA.portable.OutputStream $out = _request ("test", true);
$in = _invoke ($out);
return;
} catch (org.omg.CORBA.portable.ApplicationException $ex) {
$in = $ex.getInputStream ();
String _id = $ex.getId ();
throw new org.omg.CORBA.MARSHAL (_id);
} catch (org.omg.CORBA.portable.RemarshalException $rm) {
test ( );
} finally {
_releaseReply ($in);
}
} // test
// Type-specific CORBA::Object operations
private static String[] __ids = {
"IDL:idlpkg/objspkg/MyI:1.0"};
public String[] _ids ()
{
return (String[])__ids.clone ();
}
private void readObject (java.io.ObjectInputStream s) throws java.io.IOException
{
String str = s.readUTF ();
String[] args = null;
java.util.Properties props = null;
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);
try {
org.omg.CORBA.Object obj = orb.string_to_object (str);
org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate ();
_set_delegate (delegate);
} finally {
orb.destroy() ;
}
}
private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException
{
String[] args = null;
java.util.Properties props = null;
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);
try {
String str = orb.object_to_string (this);
s.writeUTF (str);
} finally {
orb.destroy() ;
}
}
} // class _MyIStub
生成的源码:MyI.java
package idlpkg.objspkg;
/**
* idlpkg/objspkg/MyI.java .
* 由IDL-to-Java 编译器 (可移植), 版本 "3.2"生成
* 从./test.idl
* 2021年4月21日 星期三 上午10时58分30秒 CST
*/
public interface MyI extends MyIOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
{
} // interface MyI
生成的源码:MyIHelper.java
package idlpkg.objspkg;
/**
* idlpkg/objspkg/MyIHelper.java .
* 由IDL-to-Java 编译器 (可移植), 版本 "3.2"生成
* 从./test.idl
* 2021年4月21日 星期三 上午10时58分30秒 CST
*/
abstract public class MyIHelper
{
private static String _id = "IDL:idlpkg/objspkg/MyI:1.0";
public static void insert (org.omg.CORBA.Any a, idlpkg.objspkg.MyI that)
{
org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
a.type (type ());
write (out, that);
a.read_value (out.create_input_stream (), type ());
}
public static idlpkg.objspkg.MyI extract (org.omg.CORBA.Any a)
{
return read (a.create_input_stream ());
}
private static org.omg.CORBA.TypeCode __typeCode = null;
synchronized public static org.omg.CORBA.TypeCode type ()
{
if (__typeCode == null)
{
__typeCode = org.omg.CORBA.ORB.init ().create_interface_tc (idlpkg.objspkg.MyIHelper.id (), "MyI");
}
return __typeCode;
}
public static String id ()
{
return _id;
}
public static idlpkg.objspkg.MyI read (org.omg.CORBA.portable.InputStream istream)
{
return narrow (istream.read_Object (_MyIStub.class));
}
public static void write (org.omg.CORBA.portable.OutputStream ostream, idlpkg.objspkg.MyI value)

本文深入探讨了CORBA技术,特别是其在Java中的应用。详细介绍了IDL文件的编写规范及其到Java代码的转换过程,展示了如何利用CORBA实现远程对象间的交互。
最低0.47元/天 解锁文章
506

被折叠的 条评论
为什么被折叠?



