14

指定されたクラスに特定のフィールドがあるかどうか、およびそれが初期化されているかどうか(現時点で値があるかどうか)を確認するにはどうすればよいですか?

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
           }
}
4

5 に答える 5

13

クラスに例外に依存しないプロパティがあるかどうかを確認するには、次のメソッドを使用できます。

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ます(そのため、クラスにプロパティがあるかどうかを確認するために最初のコードを使用する必要があります)

于 2014-08-27T12:06:01.937 に答える
7

たとえば、次のようにリフレクションを使用できます。

Class.forName("Foo").getFields() 

次に、リフレクションを使用して特定のオブジェクトにこのフィールドが初期化されているかどうかを再度確認できます。

于 2012-04-14T19:29:48.133 に答える
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 のモンスターの対戦相手インスタンスの場合、新しいインスタンスが作成されるたびにデフォルト値で初期化されます。

于 2012-04-14T19:38:32.717 に答える
-5
//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
 }
}
于 2012-04-14T19:27:19.240 に答える