我正在尝试检查另一个类是否有一个名为“list”的成员变量,我希望boolean
告诉我该类是否包含它。
如果班级有“list”,则boolean
返回true,一切都很好。但是如果类中没有“list”,则它不会返回false,但会导致错误:
public static void main(String[]args) throws NoSuchFieldException, SecurityException{
boolean has = Person.class.getDeclaredField("list")!=null;
System.out.println(has);
}
错误:
Exception in thread "main" java.lang.NoSuchFieldException: list
at java.lang.Class.getDeclaredField(Unknown Source)
at test.main(test.java:21)
第21行是我声明布尔值has
的地方。
所以我有两个问题:
答案 0 :(得分:2)
作为对第一个问题的回答,如果没有这样的列表,则抛出NoSuchFieldException
,因此捕获该异常然后返回或在此情况下将布尔值设置为false
。
答案 1 :(得分:2)
如果字段不存在,如果类Person中有ISNT“list”,如何返回false?
Class.getDeclaredFields()
会抛出NoSuchFieldExeption
,因此您需要抓住NoSuchFieldException
:
public static void main(String[]args) {
boolean has = false;
try {
Person.class.getDeclaredField("list");
has = true;
} catch (NoSuchFieldException nsfe) {
// intentionally ignored
}
System.out.println(has);
}
通常通常一个坏主意,简单地忽略抛出的异常(catch
块至少应该包含nsfe.printStackTrace()
),但在这种情况下它应该是细
如果varible存在,我该如何将其变成对象?
我并非100%确定您的意思,但您可以通过getDeclaredField()
的返回值获得所需属性的引用,这是{{3} - 在这种情况下,我会避免使用布尔值并稍微重构代码,例如:
// @param Person object which has a "list" member
public void printListField(Object p) throws IllegalArgumentException, IllegalAccessException {
Field listField = null;
try {
listField = Person.class.getDeclaredField("list");
} catch (NoSuchFieldException nsfe) {
// intentionally ignored
}
if (listField != null) {
Object l = listField.get(p);
System.out.println("list is " + l);
} else {
System.out.println("No list member available!");
}
}
请注意,您需要引用类Person
的实际对象才能检索对实例变量的引用。
答案 2 :(得分:1)
public static void main(String[]args) throws NoSuchFieldException, SecurityException{
try {
boolean has = Person.class.getDeclaredField("list")!=null;
} catch(NoSuchFieldException e) {
has=false;
}
System.out.println(has);
}
答案 3 :(得分:0)
那么为什么不在下面?
try {
has = Person.class.getDeclaredField("list")!=null;
}
catch (NoSuchFieldException e) {
has = false;
}
虽然我不禁认为你的设计有缺陷,所以你必须执行这项检查(如果你继承遗留代码,你可能别无选择)
答案 4 :(得分:0)
根据java-doc:
* @exception NoSuchFieldException if a field with the specified name is
* not found.
因此,如果您想检查该字段是否存在,则应截取异常:
boolean has;
try {
Person.class.getDeclaredField("list");
has = true;
} catch (NoSuchFieldException e) {
has = false;
}
答案 5 :(得分:0)
您可以通过反射获取所有字段,然后检查字段数组中的每个字段。
答案 6 :(得分:0)
如果该字段不存在,getDeclaredField方法将抛出异常(NoSuchFieldException)。所以你必须在这个方法周围放置一个try / catch块。如果你捕获NoSuchFieldException,则设置为false。
public static void main (String [] args) {
boolean has = false;
try {
Field f = Person.class.getDeclaredField("list");
has = true;
} catch (NoSuchFieldException e) {
has = false;
}
System.out.println(has);
}
请参阅以下链接中的java文档: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredField(java.lang.String)