【问题标题】:Can I inject an object of an inner class?我可以注入内部类的对象吗?
【发布时间】:2012-05-16 16:27:55
【问题描述】:

有人知道我是否可以在我的对象中注入一个内部类吗? 我想写这样的东西:

@Named
public class ClassA {

    @Inject
    private InnerClass myObject;

    public class InnerClass extends DefaultImplementation implements Serializable{
        public String overriddenMethod() {
            // do something special
        }
    }
}

我想做这些奇怪的事情,因为我有一个默认实现,用于在 80% 的用例中进行注入。但是对于特殊的逻辑,我必须重写默认实现中的一些方法。

我不想创建额外的类文件,因为我只想覆盖两行代码。

如果我在我的 OpenWebBeans-Contrainer 中尝试代码,我会收到以下错误:

javax.enterprise.inject.UnsatisfiedResolutionException: Api type [ClassA$InnerClass] is not found with the qualifiers 限定符:[@javax.enterprise.inject.Default()] 用于注入字段:private ClassA$InnerClass ClassA.myObject

【问题讨论】:

    标签: java exception-handling dependency-injection java-ee-6 cdi


    【解决方案1】:

    如果声明为“public static”,内部类的注入应该可以工作

    【讨论】:

    • 非常感谢。我意识到我可以注入一个静态类。但我想要一个类的单个对象,它有自己的实例变量。我认为静态类的对象只能有静态变量和方法。我错了吗?
    • 错误非静态内部类是必须在持有者类的实例中创建的类。这意味着内部类有一个“持有者指针”(可以访问持有者的变量)。 静态内部类独立于持有者类。在这两种情况下都是类,并且可以有static 和非static 成员或方法。
    【解决方案2】:

    要解决您的问题,只需将您的班级更改为

    public static class InnerClass //...
    

    这可能看起来有点不直观,但 java 静态类与 c# 之类的语言有很大不同。在 java 中,静态类仅用于您所处的情况,您希望利用嵌套类,而不必先创建外部类的实例。在java中创建静态类而不是嵌套类实际上是无效的。

    查看此答案了解更多详情:Why are you not able to declare a class as static in Java?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多