JavaDemo——探索CORBA的IDL与Java的应用

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

最近接触了一个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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值