Seam 2.2使用反射改变注入的场值

时间:2012-11-06 15:56:44

标签: java reflection seam seam2

我使用Seam 2.2。我想使用Reflection从Seam组件中获取私有字段。 所以我有:

    LocalizationEditActionRoot localizationEditActionRoot = (LocalizationEditActionRoot) Component
                        .getInstance(LocalizationEditActionRoot.class, true);
    Class currentClass = localizationEditActionRoot.getClass();
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

如果我想获得一个名为davClient(WebDavClient)的字段,我会收到NoSuchFieldException。该领域当然是注入的。如果我尝试这样的事情:

    Class currentClass = Class.forName("fr.isiom.bpms.admin.session.ext.action.root.LocalizationEditActionRoot");
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

我得到字段davClient但是值没有改变。他仍然是WebDavClient的实例,而不是WebDavMockClient。如何更改该字段值?

1 个答案:

答案 0 :(得分:0)

我没有设法用反射来做。相反,我发现了一个更简单的想法/解决方案 在我的测试类中,在Create / setUp方法中,我从Seam Context获取sessionContext,并将webDavClient名称更改为与WebDavMockClient而不是WebDavClient绑定。这就是你用单行解决整个问题的方法:

// Setting webDavClient to be injected by seam as WebDavMockClient to mock the actual delete
Contexts.getSessionContext().set("webDavClient", new WebDavMockClient());