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

如何使用javassist在枚举字段中创建方法,java,reflection,enums,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

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

 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();
    }
}
private void loadEnum(ServletContextEvent sce){

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

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

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

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

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

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

我使用RESTEasy进行序列化正在枚举对象并需要放置批注

@JsonFormat(shape=JsonFormat.shape.OBJECT)

并用anotation创建一个方法

@JsonCreator

需要为此创建每个枚举的方法

我必须为所有枚举动态创建方法fromObject getProperty和getType,方法fromObject是静态的。也就是说,创建此方法有所不同。我创建了注释,并且在上下文初始化时要生成这些方法

package br.com.alinesolutions.anotaai.metadata.model.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeType;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum TipoAcesso {

    EMAIL("E-Mail"),
    TELEFONE("Telefone");

    private String descricao;

    private TipoAcesso(String descricao) {
        this.descricao = descricao;
    }
    public String getDescricao() {
        return descricao;
    }
    // TODO - Adicionar metodos dinamicamente
    public String getType() {
        return this.toString();
    }

    public String getPropertieKey() {
        StringBuilder sb = new StringBuilder("enum.");
        sb.append(this.getClass().getName()).append(".");
        sb.append(toString());
        return sb.toString().toLowerCase();
    }

    @JsonCreator
    public static TipoAcesso fromObject(JsonNode node) {
        String type = null;
        if (node.getNodeType().equals(JsonNodeType.STRING)) {
            type = node.asText();
        } else {
            if (!node.has("type")) {
                throw new IllegalArgumentException();
            }
            type = node.get("type").asText();
        }
        return valueOf(type);
    }
}

我使用RESTEasy序列化枚举对象,并需要放置注释

@JsonFormat(shape=JsonFormat.shape.OBJECT)

并用anotation创建一个方法

@JsonCreator

需要为此创建每个枚举的方法

我必须为所有枚举动态创建方法fromObject getProperty和getType,方法fromObject是静态的。也就是说,创建此方法有所不同。我创建了注释,并且在上下文初始化时要生成这些方法

package br.com.alinesolutions.anotaai.metadata.model.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeType;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum TipoAcesso {

    EMAIL("E-Mail"),
    TELEFONE("Telefone");

    private String descricao;

    private TipoAcesso(String descricao) {
        this.descricao = descricao;
    }
    public String getDescricao() {
        return descricao;
    }
    // TODO - Adicionar metodos dinamicamente
    public String getType() {
        return this.toString();
    }

    public String getPropertieKey() {
        StringBuilder sb = new StringBuilder("enum.");
        sb.append(this.getClass().getName()).append(".");
        sb.append(toString());
        return sb.toString().toLowerCase();
    }

    @JsonCreator
    public static TipoAcesso fromObject(JsonNode node) {
        String type = null;
        if (node.getNodeType().equals(JsonNodeType.STRING)) {
            type = node.asText();
        } else {
            if (!node.has("type")) {
                throw new IllegalArgumentException();
            }
            type = node.get("type").asText();
        }
        return valueOf(type);
    }
}

例如,方法toString。它是在所有类型的enum中创建的。如果我在enum类中创建这三个方法,是否可以重新编译enum类?您的解决方案有一个示例?没有,您可以从基类继承方法。例如,方法toString。它是在所有类型的enum中创建的。如果我在enum cl中创建这三个方法有可能重新编译枚举类吗?你有一个解决方案的例子吗?没有,你可以从基类继承方法。