如果Java對象包含設置爲值0
的數值字段,我該如何發現(可能使用反射)?我想是這樣的:如何發現對象是否包含設置爲0的數字字段?
public boolean checkZero(Class T){
return false;
// need help here
}
然而T
不具有將檢查值的方法。
如果Java對象包含設置爲值0
的數值字段,我該如何發現(可能使用反射)?我想是這樣的:如何發現對象是否包含設置爲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;
}
請注意:這不包括,繼承的字段,如果有的話。
public boolean checkZero(Class T){
是不正確的
[檢查]如果一個Java對象包含...
你需要的是
public boolean checkZero(Object o){
現在你有一個Object
,
Object.getclass
以獲取其Class
Class.getFields
獲得其字段Field.getType
獲取字段的類setAccessible
能夠訪問潛在的私人領域。在某些情況下,這可能會失敗,請檢查文檔。Field.get
得到的那場優秀的答案!如果我可以通過使用它來完成我想要做的事情,現在將檢查它。 :) – Takarakaka
您可以通過類迭代聲明的字段,並得到他們的價值觀。但是,您還需要從中獲取值的該類的實例。
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等等來檢查值爲零的特殊情況。
偉大的代碼和偉大的答案,@Vulcan! :) – Takarakaka
不知道這是你想要什麼,但讓我們嘗試吧:)
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;
}
但是,如果我將我的私人字段設置爲可訪問,那麼會以任何方式損害我的安全性嗎? – Takarakaka
這就是我不確定這個解決方案是否是你想要的原因之一。你不必使用'f.setAccessible(true)'如果你不想:) – Pshemo
@Takarakaka'f.setAccessible(true)'永遠不會改變字段的可訪問性,只是讓'f'引用得到來自對象的該字段的值。 – Pshemo
這不是我清楚你以後。你能澄清嗎?一個班級「包含0值」意味着什麼? –
您的問題的第一個版本更好。 –
嗨邁克爾。我想我的方法來檢查一些類是否包含0值的參數。可能嗎? – Takarakaka