查看类中是否存在字段

ema*_*ine 21 java

我有一个包含各种变量的类

public class myClass{

    public int id;
    public String category;
    public String description;
    public String start;
    public String end;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法通过创建内部函数或检查调用对象来检查变量是否存在?

例如,检查myClass是否包含一个名为"category"的变量(确实如此).或者它是否包含一个名为"foo"的类别(它没有).

Bom*_*mbe 32

您的编译器通常很清楚,运行时允许您使用反射检查加载的类.

Object someObject = ...
Class<?> someClass = someObject.getClass();
Field someField = someClass.getField("foo");
Run Code Online (Sandbox Code Playgroud)

getField()如果找不到该字段,该方法将抛出异常.

  • 或者如果无法访问SecurityException(例如它是`private`) (3认同)
  • @ CrackerJack9不,使用`getField()`访问私有字段不会抛出`SecurityException`. (2认同)

Pyv*_*ves 30

警告:接受的答案将起作用,但它依赖于例外作为控制流,这是不好的做法,应尽可能避免.

相反,请考虑以下替代方案:

public boolean doesObjectContainField(Object object, String fieldName) {
    Class<?> objectClass = object.getClass();
    for (Field field : objectClass.getFields()) {
        if (field.getName().equals(fieldName)) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

或者使用Java 8流更简洁的形式:

public boolean doesObjectContainField(Object object, String fieldName) {
    return Arrays.stream(object.getClass().getFields())
            .anyMatch(f -> f.getName().equals(fieldName));
}
Run Code Online (Sandbox Code Playgroud)

这些代码片段不依赖于异常作为控制流,实际上根本不需要任何异常处理,这将使您的实现更简单,更易读.您只需使用与以下内容类似的代码调用上述方法之一:

Object someObject = ... ;
boolean fieldExists = doesObjectContainField(someObject, "foo");
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果您需要访问类的私有字段(但不是父类字段),则可以简单地替换对getFieldsby 的调用getDeclaredFields.

  • 好点!由于我曾经因为“异常作为控制流”而在生产环境中出现性能问题,我绝不建议任何人容忍“异常作为控制流” (3认同)

kme*_*era 6

正如其他人已经提到的,反射就是你需要的.

如果您需要访问私人领域,您可以使用 Class.getDeclaredField(String name)