我想将枚举的常量及其变量的值写入文件或打印出来。
例如,这是我想要实现的方法:
然而,我不太确定如何做到这一点,因为我最近才开始使用反射。这是我当前的代码。
这是我为了进行简单测试而设置的枚举(APIPerm):
然而,在
谢谢你的帮助, Sneling。
例如,这是我想要实现的方法:
id, field_name_1, field_name_2, ...
enum_id, field_value_1, field_value_2, ...
...
然而,我不太确定如何做到这一点,因为我最近才开始使用反射。这是我当前的代码。
public static void writeEnum(String filename, Enum e, SnelPlugin plugin){
SnelTextFile file = new SnelTextFile(plugin, new File(plugin.getDataFolder() + "/" + filename + ".txt"));
Logger.debug("Starting an EnumWriter for " + filename + ".txt for plugin " + plugin.getPluginName());
try {
file.openWriter(true);
Field[] fields = e.getClass().getFields();
// HEADER
String info = "";
for(Field f: fields) {
info += ", " + f.getName();
Logger.debug("Detected value: " + f.getName());
}
info = info.replaceFirst(", ", "");
file.addLine(info);
// CONTENT
for(Object current: e.getDeclaringClass().getEnumConstants()){
Logger.debug(current.toString());
String result = "";
for(Field f: fields){
result += ", " + f.get(current);
}
result = result.replaceFirst(", ", "");
file.addLine(result);
Logger.debug("Added row: " + result);
}
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {
file.closeWriter();
} catch (IOException e1) {
}
}
Logger.log(LColor.GREEN + "Finished an EnumWriter action on " + filename + ".txt from " + plugin.getPluginName());
}
这是我为了进行简单测试而设置的枚举(APIPerm):
COMMANDS_SNELAPI,
COMMANDS_SNELAPI_INFO;
private String id;
APIPerm(){
id = getID();
}
@Override
public String getPrefix() {
return "snelapi";
}
@Override
public String getID(){
return getPrefix() + "." + this.toString().toLowerCase().replaceAll("_", ".");
}
然而,在
for(Object current: e.getDeclaringClass().getEnumConstants())
中我得到了一个NPE(空指针异常)。谢谢你的帮助, Sneling。
SnelPlugin
不是必需的,则减少你的代码,不要在代码中包含它。此外,并非每个人都配置了日志记录机制,为什么不使用简单的System.out
呢? - PshemogetDeclaredFields()
而不是getFields()
。区别在于,getFields
仅返回公共字段,包括继承的字段,而getDeclaredFields()
仅返回在该类中声明的字段(甚至包括私有字段 - 因此,如果您想要获取该字段的值,则可能需要在其上先调用setAccessible(true)
)。演示:https://ideone.com/qVkHIg - Pshemo