我想写一个文件/打印枚举的常量,以及它们变量的值。
例如,以下是我的想法:
O(n)
然而,我并不完全确定如何做这样的事情,因为我最近才开始使用反射。
这是我目前的代码。
id, field_name_1, field_name_2, ...
enum_id, field_value_1, field_value_2, ...
...
这是Enum(APIPerm),我设置了一个简单的测试:
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());
}
但是,我在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("_", ".");
}
感谢您的帮助, Sneling。
答案 0 :(得分:1)
感谢@Pshemo和@MarkusFisher,我找到了解决方案。
请注意,此方法包含其他类和方法,但它们不会影响此方法的工作方式。
如果你想自己测试一下:
方法代码:
public static <E extends Enum<E>> void writeEnum(String fileName, Class<E> c, SnelPlugin plugin){
SnelTextFile file = new SnelTextFile(plugin, new File(plugin.getDataFolder() + "/" + fileName + ".txt"));
Logger.debug("Starting EnumWriter for " + file.getFile().getName(), plugin);
try {
file.openWriter(true);
Logger.debug("Opened FileWriter", plugin);
Field[] classFields = c.getDeclaredFields();
String header = "Value";
for(Field f: classFields){
if(!Modifier.isStatic(f.getModifiers())) {
header += ", " + f.getName();
Logger.debug("Discovered variable '" + f.getName() + "'", plugin);
}
}
file.addLine(header);
file.addLine("");
for(E en: c.getEnumConstants()){
Logger.debug("Reading Enum Constant: " + en.toString(), plugin);
Field[] fields = en.getDeclaringClass().getDeclaredFields();
String current = en.toString();
for(Field f: fields){
if(!Modifier.isStatic(f.getModifiers())){
f.setAccessible(true);
current += ", " + f.get(en);
Logger.debug("Value for '" +f.getName() + "' = '" + f.get(en) + "'" , plugin);
}
}
file.addLine(current);
}
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {
file.closeWriter();
Logger.debug("Closer FileWriter");
} catch (IOException ex) {
}
}
Logger.log(LColor.GREEN + "Finished EnumWriter for " + file.getFile().getName() + ". It can be found at " + file.getFile().getPath(), plugin);
}
答案 1 :(得分:0)
如果要获取Enum的值,通常只需在Enum类上调用values()
方法。但是,由于您从一个实例开始,您需要获取该类并调用它。我没有看到任何方法将类强制转换为Enum,所以我使用反射来获得这样的public static Enum[] values()
方法。
/**
* Get the Enum values for this Enum instance.
* @param e the enum value
* @return all the values for this type of enum
*/
private Enum[] getValues(Enum e) {
Enum[] values = new Enum[0];
try {
Class<? extends Enum> enumClass = e.getDeclaringClass();
Method mtd = enumClass.getMethod("values");
values = (Enum[])mtd.invoke(null, new Object[] {});
}
catch (Exception ex) {
ex.printStackTrace();
}
return values;
}
显然你应该做更好的错误处理。我不确定你想从Enum课程中得到关于字段的其他内容。