1

Java オブジェクトに value に設定された数値フィールドが含まれているかどうかを (おそらくリフレクションを使用して) どのように検出できます0か? 私は次のようなことを考えていました:

public boolean checkZero(Class T){
   return false; 
   // need help here 
}

ただしT、値をチェックするメソッドはありません。

4

4 に答える 4

3

私はあなたがこれを行うことができると思います:

     public boolean checkZero(Class clazz){
        boolean zeroNumericFields = true;
        Field[] fields = clazz.getDeclaredFields();
        boolean zeroNumericFields = true;
        List<Class> numberClasses = new ArrayList<Class>();

        //Add all types you want to check e.g.
        numberClasses.add(Number.class);
        numberClasses.add(Integer.class);
        numberClasses.add(Long.class);
        numberClasses.add(Double.class);
        numberClasses.add(Float.class);

        if(fields.length > 0){
           for(Field field : fields){
               if(numberClasses.contains(field.getType())){
                   zeroNumericFields = false;
                   break;
               }
            }
        }
        return zeroNumericFields;
     }

注意:これは、継承されたフィールドがある場合は除外します。

于 2012-10-25T01:05:20.530 に答える
2

それがあなたが望むものかどうかはわかりませんが、試してみましょう:)

static boolean checkZeroes(Object o) throws IllegalArgumentException,
        IllegalAccessException {

    Field[] fields = o.getClass().getDeclaredFields();

    for (Field f : fields) {
        // lets check what is inside of field
        f.setAccessible(true);// in case of private field
        Object value = f.get(o);

        System.out.println("checking " + f + ": " + value);
        if (value.equals((byte) 0) 
            || value.equals((short) 0)
            || value.equals((int) 0)
            || value.equals((long) 0)
            || value.equals((float) 0)
            || value.equals((double) 0)
            ){
            return true;
        }
    }
    return false;
}
于 2012-10-25T01:17:53.413 に答える
1
public boolean checkZero(Class T){

は正しくありません

[チェック中] Java オブジェクトに含まれているかどうか...

必要なのは

public boolean checkZero(Object o){

ができたのでObject

  • Object.getclassその取得に使用Class
  • Class.getFieldsフィールドを取得するために使用します
  • Field.getTypeフィールドのクラスを取得するために使用します
  • フィールドのクラスが数値かどうかを確認します
  • setAccessible潜在的な非公開フィールドにアクセスできるユーザー。これは場合によっては失敗する可能性があります。ドキュメントを確認してください。
  • Field.getそのフィールドの値を取得するために使用します
  • 正しい静的型にキャストし、0 と比較します。
于 2012-10-25T01:12:22.033 に答える
1

クラスの宣言されたフィールドを反復処理して、それらの値を取得できます。ただし、値を取得するクラスのインスタンスも必要になります。

public static boolean checkZero(Object toCheck) {
    final Class<?> numerics = new Class<?>[]{ int.class, double.class, float.class,
            long.class, short.class, byte.class, Integer.class, Double.class,
            Float.class, Long.class, Short.class, Byte.class };
    try {
        Class<?> clazz = toCheck.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            Class<?> type = field.getType();
            boolean isNumeric = false;
            for (Class<?> numeric : numerics) {
                if (type.equals(numeric)) {
                    isNumeric = true;
                    break;
                }
            }
            if (isNumeric) {
                Object value = field.get(toCheck);
                if (value == 0) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

これに関する唯一の問題は、オブジェクト フォームのプリミティブ フィールドを比較することです。ゼロに対して値をチェックするために、Field#getInt、Field#getDouble などを使用して特別なケースを作成する必要がある場合があります。

于 2012-10-25T01:14:10.450 に答える