我有一个班级
如下所示
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中的任何其他方式中执行此操作?
感谢
答案 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();
}
}
}