I want to write into a file/print the constants of an enum, as well as the values of their variables.
For example, here is what I thought of doing:
JavaScript
x
id, field_name_1, field_name_2,
enum_id, field_value_1, field_value_2,
However, I am not fully sure on how to do such a thing, as I only recently began working with reflection.
This is the code that I currently have.
JavaScript
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());
}
Here is the Enum (APIPerm), which I setup for a simple test:
JavaScript
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("_", ".");
}
However, I get an NPE in for(Object current: e.getDeclaringClass().getEnumConstants())
Thanks for your help, Sneling.
Advertisement
Answer
Thanks to @Pshemo and @MarkusFisher, I’ve come to a solution.
Note that this method DOES include other classes and methods, but they don’t affect the way this method works.
If you want to test for yourself:
- Logger.debug can be replaced with System.out.println, LColor should be deleted
- SnelPlugin is only needed for the Logger.debug and locating a directory.
- SnelTextFile is just a class to make creating text files easier. Remove if you’re only printing.
Method Code:
JavaScript
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);
}