Java反射:查找字段的名称和值

时间:2014-11-06 11:25:11

标签: java reflection field

我有一个班级

如下所示

public class SampleReflection {
      public static final String  TWO_name = "html";
      public static final String  TWO_find = "css";


      public static final String  ONE_KEY_java = "java";
      public static final String  ONE_KEY_jsp = "jsp";
      public static final String  ONE_KEY_oracle = "oracle";
      public static final String  ONE_KEY_spring = "spring";
      public static final String  ONE_KEY_struts = "struts";

}

我想获取所有以ONE_KEY开头的字段及其值。

因为ONE_KEY_xxx可以是任何数字。

如何在java反射或java中的任何其他方式中执行此操作?

感谢

2 个答案:

答案 0 :(得分:1)

您可以使用SampleReflection.class.getDeclaredFields(),迭代结果并按名称过滤。然后调用field.get(null)以获取静态字段的值。如果您还想访问非公共字段,则可能需要调用first.setAccessible(true)(前提是安全管理员允许)。

或者您可以查看Apache Common的反射实用程序,例如FieldUtils等。

根据您实际想要实现的目标,可能会有更好的方法,例如使用地图,枚举等。

在你使用enum的静态字段的情况下,这可能是一个更好的方法。 例如:

enum SampleFields {
  TWO_name("html"),
  TWO_find("css"),
  ONE_KEY_java("java"),
  ONE_KEY_jsp("jsp");
  ONE_KEY_oracle("oracle"),
  ...;

  private String value;

  private SampleFields(String v) { 
    value = v;
  }
}

然后迭代SampleFields.values()并按名称过滤。

或者,如果符合您的需要,您可以拆分名称并将地图传递给枚举值,例如

enum SampleFields {
  TWO(/*build a map "name"->"html","find"->"css")*/ ),
  ONE_KEY(/*build a map "java"->"java","jsp"->"jsp", ...*/);

  private Map<String, String> values;

  private SampleFields(Map<String, String> map) { 
    values = map;
  }
}

然后获取这样的枚举值:SampleFields.valueOf("ONE_KEY").get("java")

答案 1 :(得分:0)

感谢您的回答,

这就是我想要的,

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class SampleReflection {
    public static final String TWO_name = "html";
    public static final String TWO_find = "css";

    public static final String ONE_KEY_java = "java";
    public static final String ONE_KEY_jsp = "jsp";
    public static final String ONE_KEY_oracle = "oracle";
    public static final String ONE_KEY_spring = "spring";
    public static final String ONE_KEY_struts = "struts";

    public static void main(String[] args) {
        Class<?> thisClass = null;
         Map<String,String> keyValueMap = new HashMap<String,String>();
        try {
            thisClass = Class.forName(SampleReflection.class.getName());

            Field[] aClassFields = thisClass.getDeclaredFields();
            for(Field f : aClassFields){
                String fName = f.getName();
                if(fName.contains("ONE_KEY")){
                    keyValueMap.put(fName, (String)f.get(SampleReflection.class));
                }
            }
            for (Map.Entry<String, String> entry : keyValueMap.entrySet())
            {
                System.out.println(entry.getKey() + "=" + entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}