我有一个包含各种变量的类
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()如果找不到该字段,该方法将抛出异常.
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.
| 归档时间: |
|
| 查看次数: |
32715 次 |
| 最近记录: |