如何使用 javassist 在枚举字段中创建方法
how to create method in enum field with 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 编译器通过创建子class 是Foo
的特定class 并将该方法添加到此class 来创建这样一个方法。您需要从 Foo
中删除 final
修饰符,创建这样一个子 class 并替换为此创建枚举字段的静态初始值设定项。
我使用 RESTEasy 序列化枚举对象,需要添加注释
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
并创建一个带有注解的方法
@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);
}
}
我正在尝试在枚举中动态插入一个方法。
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 编译器通过创建子class 是Foo
的特定class 并将该方法添加到此class 来创建这样一个方法。您需要从 Foo
中删除 final
修饰符,创建这样一个子 class 并替换为此创建枚举字段的静态初始值设定项。
我使用 RESTEasy 序列化枚举对象,需要添加注释
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
并创建一个带有注解的方法
@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);
}
}