Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 煤层2.2使用反射改变注入场值_Java_Reflection_Seam_Seam2 - Fatal编程技术网

Java 煤层2.2使用反射改变注入场值

Java 煤层2.2使用反射改变注入场值,java,reflection,seam,seam2,Java,Reflection,Seam,Seam2,我使用Seam 2.2。我想使用反射从Seam组件获取一个私有字段。 因此,我: LocalizationEditActionRoot localizationEditActionRoot = (LocalizationEditActionRoot) Component .getInstance(LocalizationEditActionRoot.class, true); Class currentClass = localiz

我使用Seam 2.2。我想使用反射从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。如何更改该字段的值?

我还没有通过反射来更改它。相反,我找到了一个更简单的想法/解决方案。 在我的测试类中,在Create/setUp方法中,我从Seam上下文获取sessionContext,并将webDavClient名称更改为与WebDavMockClient绑定,而不是与webDavClient绑定。这就是你用一条直线解决整个问题的方法:

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

你说的“我得到了字段,但值没有改变”是什么意思?请记住,注入发生在方法调用周围,所以它可能不适合反射。您使用的是POJO还是EJB?在后面的示例中,请确保您没有使用代理或接口来代替某些实现。