java - 如何使用 javassist 在枚举字段中创建方法

标签 java reflection enums javassist

我正在尝试在枚举中动态插入一个方法。

 private void loadEnums(ServletContextEvent sce) {
    List<Class<?>> classes = CPScanner.scanClasses(new ClassFilter().packageName("br.com.alinesolutions.anotaai.*").annotation(EnumSerialize.class));
    CtClass ctClass = null;
    EnumMemberValue enumMemberValue;
    try {
        for (Class<?> clazz : classes) {
            if (!Enum.class.isAssignableFrom(clazz)) {
                throw new RuntimeException("class " + clazz + " is not an instance of Enum");
            }
            ClassPool.getDefault().insertClassPath(new ClassClassPath(clazz));
            ctClass = ClassPool.getDefault().get(clazz.getName());
            for (CtField field : ctClass.getFields()) {
                System.out.println(field);
                //CtMethod m = CtNewMethod.make("public String getType() { return this.toString(); }", ctClass);
                //ctClass.addMethod(m);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如何在枚举字段中创建方法?

最佳答案

我假设您尝试在枚举中创建一个方法,即

enum Foo {
  BAR {
    void qux() { }
  }
}

Java 编译器通过创建一个特定的类(该类是 Foo 的子类)并将该方法添加到此类中来创建此类方法。您需要从 Foo 中删除 final 修饰符,创建这样的子类并替换为此创建枚举字段的静态初始值设定项。

关于java - 如何使用 javassist 在枚举字段中创建方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936376/

相关文章:

java - 如何使@CreatedBy和@CreatedDate在Spring数据jdbc中不可修改?

java - Spring boot ClientHttpRequestInterceptor 在 401 上重新发送

java - Spring Web 服务客户端 XwsSecurityInterceptor afterCompletion 异常

c# - 旧版 API 需要将回调名称作为字符串传递。我可以通过扩展方法改进该 API 吗?

c# - 设置动态创建的枚举值的赋值表达式

c# - 使用标志枚举来获取权限有哪些缺点?

.net - 在 NHibernate 中映射枚举集合

java - 我们如何模拟 Ctrl+C 来阻止控制台应用程序等待 java 中的用户输入

java - 按属性对集合进行排序,以字符串形式给出

c++ - 模板特化或分离函数的语义