我的一点看法:我觉得PortableRemoteObject.narrow()还是有必要的,首先它是针对远程Home接口的,调用是采用的协议是IIOP,可能它会调CORBA中的对象方法,这时你如果不作narrow转换,那么可能就会出现对象在内存中的存放格式或者其他不一样,肯定会导致错误的发生。如果你做了narrow转换,那么就可以防止这种错误的发生,我认为这是体现narrow安全的一个方面。另外,我想J2EE体系的架构师既然引入了这一点,肯定是必须这样的,以我们目前的知识层次肯定没有他们考虑得那么周到,所以用就好了,不想太多了。

解决方案 »

  1.   

    我看的一本书上说:如果服务器和客户断都在一个主机上时可以直接转型,若不在一个机子上时需要用PortableRemoteObject.narrow()来转型。
      

  2.   

    本地调用是不需要用narrow()转型的,可以直接使用java的类型转换直接转型,本地调用和远程调用最大的区别的就是本地调用中,stub类对客户端内存是可见的,而远程调用stub类只存在于服务器端,也就是对客户端内存是不可见的,而Ed Roman的《精通EJB》也是这样做解释的,又此可以推断在对象类型转换中是需要类来协助的,而今天我做了一个测试,就是在类型转换的时候把生成的class文件删除,照样可以转换成功,所以感觉又不需要类来协助,所以更加茫然,在narrow()这个方法里到底做了什么操作,和普通的转换到底有什么不同还是搞不明白,比较郁闷!希望继续讨论!
      

  3.   

    ejb是建立在rmi-iiop之上的,这一点在《精通ejb》上面也讲的很清楚,如果想实现跨平台,就必须用narrow,然后使之能通过iiop来传送,而不是直接发送本地的串行字块
      

  4.   

    j2ee规定的,是为了保障远程操作,直接转换的话容器就不能帮你管理了
      

  5.   

    我觉得这和EJB建立在什么通信协议上没有关系,关键是看这种协议是否有能力自动下载STUB文件,rmi就具有这个功能,所以不需要narrow(),而IIOP没有这个功能所以要narrow(),但是不narrow()和narrow()的区别到底体现在哪里呢?有一点是要肯定的,就是在不narrow()的情况下照样可以实现远程调用,程序一样可以很好的运行,这点我已经测试过,无论是在本机上还是在远程!