使用ByteBuddy在运行时定义枚举

时间:2016-08-17 09:12:40

标签: java enums byte-buddy

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

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

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

我在考虑ByteBuddy在运行时生成枚举。但是我找不到一个简洁的方法来做这个,资源不是那么多。

编辑:

更具体地说,我的代码中包含的内容:

private enum MyEnum{
    FOO, BAR;
}

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

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

是否有一些技巧可以使用,或者在运行时可以做什么?

3 个答案:

答案 0 :(得分:1)

使用静态字段编译到类的枚举类型

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

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

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

答案 1 :(得分:0)

您可以轻松地使用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");

免责声明:如果这是解决问题的最佳方法,那么您的问题确实没有足够的用例来允许断言。

答案 2 :(得分:-1)

您可以在任何给定的Enumeration

中在运行时检索Collection
java.util.Collections.enumeration(set)

请参阅this SO answer