我想实现一个方法,该方法从定义指定(int)值的接口返回字段。我没有界面来源。
所以,签名可能是这样的:
public ArrayList<String> getFieldnames(Object src, int targetValue);
我在内部假设它可以找到声明的字段并根据值测试每个字段,返回列表。
ArrayList<String> s = new ArrayList<String>();
if( src!= null )
{
Field[] flist = src.getClass().getDeclaredFields();
for (Field f : flist )
if( f.getType() == int.class )
try {
if( f.getInt(null) == targetValue) {
s.add(f.getName());
break;
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
return s;
不幸的是,这个实现是不正确的 - 就好像在使用接口本身调用时根本没有字段。如果我传递一个实现接口的对象,可能的字段列表将太宽而无法使用。
感谢您的帮助!
答案 0 :(得分:3)
public ArrayList<String> getFieldnames(Object src, int targetValue) {
final Class<?> myInterfaceClass = MyInterface.class;
ArrayList<String> fieldNames = new ArrayList<>();
if (src != null) {
for (Class<?> currentClass = src.getClass(); currentClass != null; currentClass = currentClass.getSuperclass()) {
Class<?> [] interfaces = currentClass.getInterfaces();
if (Arrays.asList(interfaces).contains(myInterfaceClass)) {
for (Field field : currentClass.getDeclaredFields()) {
if (field.getType().equals(int.class)) {
try {
int value = field.getInt(null);
if (value == targetValue) {
fieldNames.add(field.getName());
}
} catch (IllegalAccessException ex) {
// Do nothing. Always comment empty blocks.
}
}
}
}
}
}
return fieldNames;
}
答案 1 :(得分:0)
这个
src.getClass()
返回src类而不是接口。考虑一下这个
interface I {
}
class A implements I {
}
new A().getClass() -- returns A.class
答案 2 :(得分:0)
虽然我宁愿传入一个对象,但我想将签名更改为字符串值,并且传入FQIN也可以完成工作。
感谢&lt; this question&gt;这个想法(以及谷歌指导我)。
解决方案:
public ArrayList<String> getFieldnamesByValue(Class<?>x, int targetValue)
{
ArrayList<String> s = new ArrayList<String>();
if( x != null )
{
Field[] flist = x.getDeclaredFields();
for (Field f : flist )
if( f.getType() == int.class )
try {
if( f.getInt(null) == targetValue) {
s.add(f.getName());
break;
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
return s;
}