用内部类注释类

时间:2012-08-24 21:53:14

标签: java reflection annotations

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

@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。

甚至可以引用嵌套类?

3 个答案:

答案 0 :(得分:9)

从评论中......显然是

@Factory(Foo.FooFactory.class)

是必要的。

答案 1 :(得分:4)

您正在使用非静态嵌套类,该类的范围限定为枚举的各个实例。

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

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);
    }
}

答案 2 :(得分:3)

在您的注释出现时,FooFactory未定义,因此需要指定完整路径:

@Factory(Foo.FooFactory.class)