Java 从静态内部类对CDI注入的外部类进行私有访问时出错

Java 从静态内部类对CDI注入的外部类进行私有访问时出错,java,cdi,jboss-weld,weld,Java,Cdi,Jboss Weld,Weld,在JBoss EAP 6.0.1中,我有以下CDI管理的bean(最低版本) @ApplicationScoped public class Outer { private final List<String> values = new ArrayList<String>(); public void printValues() { System.out.println("Values: " + values); } p

在JBoss EAP 6.0.1中,我有以下CDI管理的bean(最低版本)

@ApplicationScoped
public class Outer {
    private final List<String> values = new ArrayList<String>();

    public void printValues() {
        System.out.println("Values: " + values);
    }

    private void addValue(String value) {
        values.add(value);
    }

    public static class Inner {

        @Inject
        private Outer outer;

        public void addFoo() {
            outer.addValue("foo");
        }
    }
}
我得到的输出是:

Values: {}
在那里我会期望值foo

进一步的调查显示,调用
private void addValue
访问
values
属性的一个版本,该属性位于Weld生成的
Outer
代理中,而调用
public void printValues
访问真实托管bean实例的真实属性

让事情变得更加混乱:如果我将
addValue
的访问级别更改为
package
中的一个,
protected
public
一切正常

但在我的例子中,内部类的目的是使该方法成为私有的,以便外部的其他CDI客户机不能调用该方法。现在这是唯一不起作用的东西:D


知道怎么了吗?这是Weld中的一个bug吗?

目前所有CDI提供程序都使用代理(这不是规范所要求的,但这三个IMPL都是这样做的)来注入任何非伪作用域对象。如果Outer是
@dependent范围的
,我很确定它会按照您希望的方式工作。创建的代理自然是类的子类,因此在注入对象上调用私有方法是行不通的。老实说,我很惊讶它没有爆炸。

在进一步阅读之后,我想对这种行为的解释在于java创建和使用Synthetic访问器方法来访问外部类的私有成员的方式。
Values: {}