0

我有一个项目,它使用一个枚举作为一个类的参数,它的签名是这样的:

 public class MyClass<E extends Enum<E>> extends ExtendedClass

问题是,我不想定义一个枚举并为每个新枚举再次进行相同的编程。

我正在考虑ByteBuddy在运行时生成枚举。但我没有找到一种巧妙的方法来做到这一点,而且资源也不多。

编辑:

更具体地说,我的代码中有什么:

private enum MyEnum{
    FOO, BAR;
}

MyClass<MyEnum> obs = new MyClass<MyEnum>() 

当我使用 ByteBuddy 生成的 Enum 时它不起作用;在这种情况下,它不被视为一种类型(编译错误)。

是否有一些技巧可以使用,或者这就是可以在运行时完成的事情?

4

3 回答 3

2

枚举类型被编译为带有静态字段的类,所以

enum MyEnum {
  FOO
}

编译为

class MyEnum extends java.lang.Enum<MyEnum> {
  public static final Sample FOO;
  // synthetic
  private static final Sample[] $VALUES;

  static {
    FOO = new MyEnum("FOO", 0);
    $VALUES = new MyEnum[] {FOO};
  }

  private MyEnum(String name, int ordinal) {
    super(name, ordinal);
  }

  // and other helpers
  public static MyEnum[] values() { /* $VALUES */ }
  public static MyEnum valueOf(String name) { /* $VALUES lookup */ }
}

(这就是为什么枚举不能扩展另一个只实现接口的类)。所以你需要生成这种类来模拟枚举。

于 2016-08-17T09:39:51.790 回答
1

您可以使用 Byte Buddy 轻松创建枚举:

Class<? extends Enum<?>> type = new ByteBuddy()
  .makeEnumeration("FOO", "BAR")
  // define methods/fields if required.
  .make()
  .load(MyClass.class.getClassLoader())
  .getLoaded();

这为您提供了一个枚举类型。您可以通过以下方式读取常量:

Enum<?> foo = Enum.valueOf(type, "FOO");
Enum<?> bar = Enum.valueOf(type, "BAR");

免责声明:但是,如果这是解决您的问题的最佳方法,您的问题并没有充分描述您的用例以允许断言。

于 2016-08-17T15:15:15.410 回答
-2

您可以Enumeration在运行时从任何给定的 检索Collection

java.util.Collections.enumeration(set)

看到这个答案

于 2016-08-17T15:36:25.537 回答