Java 煤层2.2使用反射改变注入场值
我使用Seam 2.2。我想使用反射从Seam组件获取一个私有字段。 因此,我: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
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?在后面的示例中,请确保您没有使用代理或接口来代替某些实现。