Java オブジェクトに value に設定された数値フィールドが含まれているかどうかを (おそらくリフレクションを使用して) どのように検出できます0
か? 私は次のようなことを考えていました:
public boolean checkZero(Class T){
return false;
// need help here
}
ただしT
、値をチェックするメソッドはありません。
Java オブジェクトに value に設定された数値フィールドが含まれているかどうかを (おそらくリフレクションを使用して) どのように検出できます0
か? 私は次のようなことを考えていました:
public boolean checkZero(Class T){
return false;
// need help here
}
ただしT
、値をチェックするメソッドはありません。
私はあなたがこれを行うことができると思います:
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;
}
注意:これは、継承されたフィールドがある場合は除外します。
それがあなたが望むものかどうかはわかりませんが、試してみましょう:)
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;
}
public boolean checkZero(Class T){
は正しくありません
[チェック中] Java オブジェクトに含まれているかどうか...
必要なのは
public boolean checkZero(Object o){
ができたのでObject
、
Object.getclass
その取得に使用Class
Class.getFields
フィールドを取得するために使用しますField.getType
フィールドのクラスを取得するために使用しますsetAccessible
潜在的な非公開フィールドにアクセスできるユーザー。これは場合によっては失敗する可能性があります。ドキュメントを確認してください。Field.get
そのフィールドの値を取得するために使用しますクラスの宣言されたフィールドを反復処理して、それらの値を取得できます。ただし、値を取得するクラスのインスタンスも必要になります。
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 などを使用して特別なケースを作成する必要がある場合があります。