获取Enum下的变量值

时间:2016-09-03 21:30:46

标签: java reflection enums

我想写一个文件/打印枚举的常量,以及它们变量的值。

例如,以下是我的想法:

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("_", "."); }

中获得了NPE

感谢您的帮助, Sneling。

2 个答案:

答案 0 :(得分:1)

感谢@Pshemo和@MarkusFisher,我找到了解决方案。

请注意,此方法包含其他类和方法,但它们不会影响此方法的工作方式。

如果你想自己测试一下:

  • Logger.debug可以替换为System.out.println,LColor应该 被删除
  • 仅在Logger.debug和定位目录时需要SnelPlugin。
  • SnelTextFile只是一个让创建文本文件更容易的类。如果您只是打印,请删除。

方法代码:

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课程中得到关于字段的其他内容。