如何检查给定的类是否具有特定字段以及是否已初始化(目前有值)?
abstract class Player extends GameCahracter {
}
public class Monster extends GameCahracter{
public int level = 1;
}
abstract class GameCharacter{
public void attack(GameCahracter opponent){
if (opponent instanceof Monster && ){ // << here I have to know is it instance of Monster and if it has initialized value
}
}
答案 0 :(得分:8)
要查看某个类是否具有不依赖异常的属性,可以使用以下方法:
private Boolean objectHasProperty(Object obj, String propertyName){
List<Field> properties = getAllFields(obj);
for(Field field : properties){
if(field.getName().equalsIgnoreCase(propertyName)){
return true;
}
}
return false;
}
private static List<Field> getAllFields(Object obj){
List<Field> fields = new ArrayList<Field>();
getAllFieldsRecursive(fields, obj.getClass());
return fields;
}
private static List<Field> getAllFieldsRecursive(List<Field> fields, Class<?> type) {
for (Field field: type.getDeclaredFields()) {
fields.add(field);
}
if (type.getSuperclass() != null) {
fields = getAllFieldsRecursive(fields, type.getSuperclass());
}
return fields;
}
只需致电:
objectHasProperty(objInstance, "myPropertyName");
实际上,看看类是否具有属性,类的实例并不重要,但是我这样做了,只是为了更加友好。 只是得出结论:我使getAllFields递归,以获得所有超类方法(在我的情况下,这很重要)
之后,如果您想查看所需对象中属性的值,您可以调用:
PropertyUtils.getProperty(objInstance, "myPropertyName");
请记住:如果objInstance
没有该属性,则上面的调用将抛出NoSuchMethodException
(这就是为什么你需要使用第一个代码来查看该类是否具有该属性)
答案 1 :(得分:6)
您可以使用反射,例如:
Class.forName("Foo").getFields()
然后,您可以再次检查特定对象是否使用反射初始化此字段。
答案 2 :(得分:4)
您不必为此使用反射,只需使用if条件即可。
if (opponent !=null && opponent instanceof Monster && ((Monster) opponent).level==1){ // << here I have to know is it instance of Monster and if it has initialized value
}
如果实例不为null,那么你可以检查实例是否为null,然后在你的情况下它的Monster实例是肯定初始化的。每当创建一个新实例时,如果怪物的对手实例的等级值为1,则使用默认值初始化实例变量。
答案 3 :(得分:-2)
//Load the class
Class clazz = Class.forName("your.class.ClassName");
Field field = clazz.getField("fieldName")
if(field!=null){
//field exist now check if its initialized or not, or if its primitive field check against its assumed initialized value
if(ClassName.fieldName!=null){
//yes initilized
}
}