Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用内部类注释类_Java_Reflection_Annotations - Fatal编程技术网

Java 用内部类注释类

Java 用内部类注释类,java,reflection,annotations,Java,Reflection,Annotations,我通过反射创建我的枚举,为此我向每个枚举添加了一个内部类,该类实现了抽象工厂。现在我想访问这个内部类以调用该方法: @Factory(FooFactory.class) public enum Foo { FOO, BAR; public class FooFactory implements AbstractFactory<Foo> { public Foo create(String value) { r

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

@Factory(FooFactory.class)
public enum Foo {

     FOO, BAR;

     public class FooFactory implements AbstractFactory<Foo> {

          public Foo create(String value) {
               return valueOf(value.toUpperCase());
          }
     }
}
但是,通过此操作,我收到以下错误:

类无法解析为FooFactory.java类型

import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface Factory {
        Class<?> value();
}
当我尝试
@Factory(Foo$FooFactory.class)
时,我收到错误:

无法使用其二进制名称引用嵌套的Foo$FooFactory


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

您使用的是一个非静态嵌套类,其作用域为枚举的各个实例

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

public static class FooFactory implements AbstractFactory<Foo> {

      public static Foo create(String value) {
           return valueOf(value.toUpperCase());
      }
 }
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);
    }
}

在显示注释时,FooFactory未定义,因此需要指定完整路径:

@Factory(Foo.FooFactory.class)

从评论中。。。显然

@Factory(Foo.FooFactory.class)

是必需的。

我怀疑FooFactory需要是
公共静态类
@Charlie我已经尝试过了。枚举通常用于固定的已知值。这似乎有点奇怪。您是否尝试过
@Factory(Foo.FooFactory.class)
?@Charlie编译时是的。Charlie你的第二个建议实际上起到了作用,用点分隔内部和外部类是解决方案。如果你愿意,你可以回答这个问题,我接受,因为你是第一个提出这个问题的。然后,你还有一些事情没有告诉我们。。我可以让你的设置工作。我将在代码示例中进行编辑。它确实有效,但与
静态
修饰符无关。
@Factory(Foo.FooFactory.class)