如何检查类是否有变量并在其他类中声明它

时间:2014-01-29 14:11:52

标签: java exception

我正在尝试检查另一个类是否有一个名为“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的地方。 所以我有两个问题:

  1. 如果在类Person中有ISNT“list”,我该如何返回false?
  2. 如果varible存在,我该如何将它变成一个对象?

7 个答案:

答案 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)