Java反射没有修改我的@Named bean变量

时间:2011-04-15 11:39:24

标签: java reflection ejb named

我知道不应该使用反射,但这是暂时的解决方案,直到......

我有1:

@Named("PoiBean")
@SessionScoped
public class PoiBean implements ActionContext, Serializable {
   private String name = "www";

   @EJB
   private NavigationServiceRemote nav;

@PostConstruct
private void testReflection() {
    try {
        nav.TestMe(this);
    } catch (NoSuchMethodException ex) {
        Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalArgumentException ex) {
        Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvocationTargetException ex) {
        Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void prepareListAllForm() {
    this.setName("test me");
    }
}

我有2:

@Stateless(mappedName="NavigationService")
public class NavigationServiceBean implements NavigationServiceRemote, NavigationContext {
    @Override
     public void TestMe(ActionContext ctx) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 

        Method method = ctx.getClass().getMethod("prepareListAllForm", new Class[] {});
        method.invoke(ctx, new Object[] {});
      }

解释:当PoiBean启动时,会注入EJB nav,然后在@PostConstruct中调用测试方法TestMe。

当我调试时,在测试我的名字= www之前,在PoiBean :: prepareListAllForm(由反射调用)中,名称变量被修改=“测试我”,并且在返回后名称返回到www。

就像反射在PoiBean的副本上调用prepareListAllForm ......

我现在想要实现的是使用prepareListAllForm函数修改该变量,该函数使用来自@EJB的反射调用。

1 个答案:

答案 0 :(得分:0)

NavigationServiceRemote是否注释了@Remote?远程调用EJB接口将对参数进行编组/解组并返回值,因此TestMe方法将接收PoiBean的副本。如果要修改实例,则需要使用本地EJB。