奇怪呀,是我问题没描述清楚吗?一般获得一个ejb不都是先lookup获得home的引用,再用它的引用narrow一下才能真正得到home实例的引用吗,问的就是这个问题,什么时候远程的东西需要narrow,什么时候不需要。

解决方案 »

  1.   

    lookup出来的是一个JNDI注册的对象,拿过来就是一个Object,当然是可以直接造型的了。
      

  2.   

    当一个EJB对象通过JNDI发布后,在JNDI树中存储的都是Object,至于是什么类型的Object,JNDI树并不关心,所以当每次我们通过lookup查询JNDI树的时候,得到的也是一个对应的Object,原则上来说,当我们得到一个Object后,是直接可以将其构形为我们所希望的类型,之所有在构形之前调用PortableRemoteObject.narrow方法是确保我们所得到的远程对象能构形为我们所希望的类型。
    PortableRemoteObject.narrow方法起到一个检查类型的目的
      

  3.   

    其实这是一个EJB RMI的问题!
      

  4.   

    当然属于rmi的问题,但不明白是为什么。
      

  5.   

    远程的话要narrow!本地的话就不要了!直接lookup就可以了!
      

  6.   

    希望大家共同学习.....
    欢迎高手加入!!!!!!!!!!!!!QQ群:
       唯爱J2EE(java开发):14402276(人员已满)
       唯爱J2EE(二群):15472518
      
    ********************不要重复加入,谢谢**************************
    此群只加J2EE方面的人才与高手...或搞JAVA 一年以上的.....其他人不加........加群时,,注明:J2EE方面的技术体系,,,如:Struts,Spring,Hibenate,EJB,JSF,Ajax,Oracle,Weblogic等有关技术,方能通过....
      

  7.   

    to longer84:
      是啊,我知道远程需要lookup,但为什么呢?看了jdk的源代码,但太长太多,看不明白。
      

  8.   

    当使用的是远程home接口就需要这样转,本地就不需要
      

  9.   

    原理?原因?为了corba兼容是什么意思?
      

  10.   

    After looking up
    the remote object, we perform the operation javax.rmi.PortableRemote
    Object.narrow(). This is a static method on an RMI-IIOP class called
    PortableRemoteObject. This method casts the generic object that we
    looked up via JNDI to our RMI-IIOP interface type. This narrow() operation
    is required whenever you look up an RMI-IIOP object via JNDI. Why do we
    need it, and why don’t we just cast it using a regular Java cast? The short
    answer is that the networking layer needs a chance to sneak in and create the
    necessary stub objects. Obviously, the code for these stubs must be available at
    this time. In most cases, that requires that the rmic command has been run previously
    to generate them.
      

  11.   

    我也想知道为什么remote invoke 需要窄话
      

  12.   

    我来说说我的看法远程lookup一个对象的时候,返回的对象的引用并不明确。我们只知道它是一个Object,而不清楚是否是我们所需要的特定的类的对象(这里就是EjbHome)。所以用narrow方法,把lookup到的对象和EjbHome.class作为参数传进去,检查是否匹配,然后再转换成我们需要的类型。而本地lookup一个对象的时候就有所不同,因为本地的对象是已经在本地JVM中存在的,注册过的Class的对象,所以已经知道lookup到的对象是什么类的引用,因此,就不必用narrow方法检查,而可以直接转型。这是我的个人想法,不保证正确,欢迎大家继续探讨。
      

  13.   

    lookup一个remote Object  需要narrow成你需要的类型  要这么用!
      

  14.   

    mysticality说是为了生成桩,但我曾经试过布署在本机上的远程home接口,不经narrow而强制转换也可以得到其实例,这又怎么解释呢?
      

  15.   


    群号: 23943948  
    名字: 程序↑人生?⑴
    要求: J2EE高手进 热心人进  你的指点将使你我他茅舍顿开
      

  16.   

    是为了与CORBA 兼容因为CORBA是支持多种语言的 
      

  17.   

    PortableRemoteObject.narrow方法的目的就是CORBA协作,在EJB以前有类似的一个CORBA来进行操作的,虽然本身CORBA比较的强大,但是非常难于使用,在EJB中为了添加对CORBA的支持,所以在使用home接口以前需要用PortableRemoteObject.narrow方法处理一下
      

  18.   

    还不是很精通
    远程调用要narrow!
    本地调用lookup!
    不过要是用narrow是不是不能本地调用啊