【问题标题】:Annotate class with inner class用内部类注释类
【发布时间】:2012-08-24 21:53:14
【问题描述】:

我通过反射创建我的枚举,为此我向每个枚举添加一个实现抽象工厂的内部类。现在我想访问这个内部类以调用该方法:

@Factory(FooFactory.class)
public enum Foo {

     FOO, BAR;

     public class FooFactory implements AbstractFactory<Foo> {

          public Foo create(String value) {
               return valueOf(value.toUpperCase());
          }
     }
}

@Factory的定义是:

@Retention(RetentionPolicy.RUNTIME)
public @interface Factory {

        Class<?> value();
}

但是,我收到以下错误

类无法解析为 FooFactory.java 类型

当我尝试@Factory(Foo$FooFactory.class) 时,我收到错误

嵌套的 Foo$FooFactory 不能使用其二进制名称来引用。

那么甚至可以引用嵌套类吗?

【问题讨论】:

  • 我怀疑 FooFactory 需要是public static class
  • @Charlie 我已经试过了。
  • 枚举通常用于固定的已知值。这似乎有点奇怪。
  • 你试过@Factory(Foo.FooFactory.class) 吗?
  • @Charlie 在编译时是的。查理,您的第二个建议实际上确实可以用点分隔内部和外部类是解决方案。如果你愿意,你可以回答这个问题,我接受它,因为你先建议了。

标签: java reflection annotations


【解决方案1】:

来自cmets...显然

@Factory(Foo.FooFactory.class)

需要。

【讨论】:

    【解决方案2】:

    您正在使用非静态嵌套类,它的作用域是枚举的各个实例。

    相反,您需要一个静态嵌套类,如下所示:

    public static class FooFactory implements AbstractFactory<Foo> {
    
          public static Foo create(String value) {
               return valueOf(value.toUpperCase());
          }
     }
    

    但是,所有这些都是多余的:您只需调用Foo.valueOf(value) 即可实现此目标。我没有看到这里有任何附加值(没有双关语)。

    Factory.java

    import java.lang.annotation.*;
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Factory {
            Class<?> value();
    }
    

    FooEnum.java

    @Factory(FooEnum.FooFactory.class)
    public enum FooEnum {
        FOO, BAR;
        public static class FooFactory  {
    
              public static FooEnum create(String value) {
                   return valueOf(value.toUpperCase());
              }
         }
    }
    

    FooEnumMain.java

    public class FooEnumMain {
        public static void main(String[] args) {
            FooEnum f = FooEnum.FooFactory.create("foo");
            System.out.println(f);
        }
    }
    

    【讨论】:

    • 那么您还有其他事情正在发生,您没有告诉我们......我能够让您的设置正常工作。我将在代码示例中进行编辑。
    • 确实有效,但与static修饰符无关。
    【解决方案3】:

    在你的注解出现时,FooFactory 是未定义的,所以需要指定完整路径:

    @Factory(Foo.FooFactory.class)
    

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2019-02-16
      • 2021-09-13
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多