Java Refelection : find field's name and value

2019-09-20 14:35发布

问题:

I have a class

like below

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";

}

I would like to get all the fields which starts with ONE_KEY and their value.

because the ONE_KEY_xxx can be of any numbers.

how to do this in java reflection or any other way in java ?

thanks

回答1:

You can use SampleReflection.class.getDeclaredFields(), iterate over the result and filter by name. Then call field.get(null) to get the value of the static fields. If you want to access non-public fields as well you might have to call first.setAccessible(true) (provided the security manager allows that).

Alternatively you could have a look at Apache Common's reflection utilities, e.g. FieldUtils and the like.

Depending on what you actually want to achieve there might be better approaches though, e.g. using a map, enums etc.

In your case where you have static fields using an enum might be a better way to go. Example:

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;
  }
}

Then iterate over SampleFields.values() and filter by name.

Alternatively, if that fits your needs, you could split the names and pass a map to the enum values, e.g.

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;
  }
}

Then get the enum values like this: SampleFields.valueOf("ONE_KEY").get("java")



回答2:

Thanks for the answer,

this is what i was looking for,

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();
        }
    }

}