Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态返回Java中所有类变量值的列表_Java - Fatal编程技术网

动态返回Java中所有类变量值的列表

动态返回Java中所有类变量值的列表,java,Java,我在解析XML元素时创建了一个助手类,因此开发人员不需要知道XML字段的确切名称和大小写 private static class TagNames{ public static String RESOURCE_ID = "ResourceId"; public static String RESOURCE_NAME = "ResourceName"; public static String RESOURCE_PRICE = "ResourcePrice";

我在解析XML元素时创建了一个助手类,因此开发人员不需要知道XML字段的确切名称和大小写

private static class TagNames{
      public static String RESOURCE_ID = "ResourceId";
      public static String RESOURCE_NAME = "ResourceName";
      public static String RESOURCE_PRICE = "ResourcePrice";
}
这样可以更容易地执行以下操作:

someXMLParser.getValueByTagName(TagNames.RESOURCE_ID);
我的问题是。如果我想迭代类标记名中声明的所有字段,我该怎么做?伪代码:

For tag in TagNames:
   someXMLParser.getValueByTagName(tag)
我知道我可能不得不重新调整这一切。但我想不出一种方法,可以让这些名字既容易访问又易于阅读,而且不会有任何重复


有什么建议吗

> P>您可能想考虑使用A类而不是类来存储标记名。可能需要对代码进行一点修改,但与您现在所做的相比,生成标记列表会更容易,并且添加新标记不需要太多工作,只需在属性文件中添加一行即可

使用enum和附带的数组,您可以非常轻松地执行此操作:

public class Main {

    public enum TagName { RESOURCE_ID, REOURCE_NAME, RESOURCE_PRICE }

    private static String[] tags = {"ResourceID", "ResourceName", "ResourcePrice"};

    public static String getValueByTagName(TagName tag) {

    return tags[tag.ordinal()];
    }

    public static void main(String[] args) {

    System.out.println("Calling by getValueByTagName:");
    System.out.println(getValueByTagName(TagName.RESOURCE_ID));

    System.out.println("Calling TagName.values() for loop:");

    for (TagName t : TagName.values()) {

        System.out.println(getValueByTagName(t));
    }
    }
}

使用枚举非常合适,特别是如果使用自定义构造函数和内置的“values”方法:

公共类主{
公共静态枚举标记名{
资源ID(“资源ID”),
资源名称(“资源名称”),
资源价格(“资源价格”),
;
私有字符串;
专用标记名(字符串s){this.s=s;}
公共字符串toString(){返回this.s;}
公共静态字符串[]字符串(){
List ss=new ArrayList();
用于(标记名:TagName.values()){
ss.add(标记名.toString());
}
返回ss.toArray(新字符串[ss.size()]);
}
}
公共静态void main(字符串[]args){
//将TagName.values()用于枚举或字符串。。。
对于(字符串s:TagName.strings()){
系统输出打印项次;
}
}
}

通过这种方式,您可以简单地添加新标记,它们将通过“strings”方法自动获取;为了获得额外的性能,您可以静态地只计算该字符串数组一次,因为您无法动态更改枚举集。如果标记字符串真的被规范化了,那么通过从它们的常量值自动生成标记字符串,您可能会变得更加有趣…

尽管我同意您可能应该使用枚举或ResourceBundle,但这里有一个解决实际问题的方法。从给定类中的所有公共常量生成映射名->值的方法(唯一缺少的应该是
try
/
catch
throws

公共静态映射getConstantValue(类clazz){
Map constantValues=新LinkedHashMap();
for(字段:clazz.getDeclaredFields()){
int modifiers=field.getModifiers();
if(修饰符.isPublic(mod)
&&修改器。isStatic(mod)和&修改器。isFinal(mod)){
constantValues.put(field.getName(),field.get(null));
}
}
返回常量值;
}

您实际上是在要求基于的解决方案,但我认为在这种情况下,Java枚举可能是更好的选择。基于:


很好,但我建议将标记名存储在枚举本身中,这样您就不必担心将枚举常量序号与标记名数组中的索引对齐。public static constant?:-)那是一些C#!但你是对的,我想反思是对他的问题最直截了当的回答。哦,上帝,还有一只可怕的虫子。这就是你早餐前回答这么多问题得到的结果:-)@maerics-和你的答案非常相似!谢谢你的提醒,不过我确实认为你的方式更好:)
public class Main {
  public static enum TagName {
    RESOURCE_ID("ResourceId"),
    RESOURCE_NAME("ResourceName"),
    RESOURCE_PRICE("ResourcePrice"),
    ;
    private String s;
    private TagName(String s) { this.s = s; }
    public String toString() { return this.s; }
    public static String[] strings() {
      List<String> ss = new ArrayList<String>();
      for (TagName tagName : TagName.values()) {
        ss.add(tagName.toString());
      }
      return ss.toArray(new String[ss.size()]);
    }
  }
  public static void main(String[] args) {
    // Use TagName.values() for the enums, or for strings...
    for (String s : TagName.strings()) {
      System.out.println(s);
    }
  }
}
public static Map<String, Object> getConstantValues(Class<?> clazz){

    Map<String, Object> constantValues = new LinkedHashMap<String, Object>();
    for(Field field : clazz.getDeclaredFields()){
        int modifiers = field.getModifiers();
        if(Modifiers.isPublic(mod)
            && Modifiers.isStatic(mod) && Modifiers.isFinal(mod)){
            constantValues.put(field.getName(), field.get(null));
        }
    }
    return constantValues;
}
public class EnumTest {
    public enum Tags {
        RESOURCE_ID("ResourceId"), 
        REOURCE_NAME("ResourceName"), 
        RESOURCE_PRICE("ResourcePrice");

        private final String tagName;
        Tags(String tagName) {
            this.tagName = tagName;
        }

        public String getTagName() {
            return tagName;
        }
    }

    public static void main(String[] args) {
        for(Tags tag : Tags.values()) {
            System.out.println("const:" + tag.name() 
                    + " tagName:" + tag.getTagName());
        }
        // API user might do e.g.:
        // document.getValueForTag(Tags.REOURCE_NAME);
    }
}