2017-03-04 53 views
2

我無法使用java反射將布爾值設置爲字段。 字段數據類型是java.lang.Boolean。然而,如果數據類型是原始類型,即布爾值,我可以設置該值。無法通過反射設置布爾值

下面是一個簡單VO與布爾類型和原語類型:

public class TestVO { 
    private Boolean bigBoolean; 
    private boolean smallBoolean; 
} 

這是我的Java反射代碼:

public class TestClass { 
    public static void main(String args[]) 
      throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { 
     TestVO testVO1 = new TestVO(); 

     Class testVO = testVO1.getClass(); 
     Field smallBooleanField = TestVO.class.getDeclaredField("smallBoolean"); 
     Field bigBooleanField = TestVO.class.getDeclaredField("bigBoolean"); 

     String name1 = smallBooleanField.getName(); 
     System.out.println("SmallBoolean Fieldname is: " + name1); 

     smallBooleanField.setAccessible(true); 

     // get the value of this private field 
     Boolean fieldValue = (Boolean) smallBooleanField.get(testVO1); 
     System.out.println("fieldValue = " + fieldValue); 

     smallBooleanField.setAccessible(true); 
     smallBooleanField.setBoolean(testVO1, true); 

     // get the value of this private field 
     fieldValue = (Boolean) smallBooleanField.get(testVO1); 
     System.out.println("fieldValue = " + fieldValue); 

     name1 = bigBooleanField.getName(); 
     System.out.println("bigBooleanField Fieldname is: " + name1); 

     bigBooleanField.setAccessible(true); 

     // get the value of this private field 
     fieldValue = (Boolean) bigBooleanField.get(testVO1); 
     System.out.println("fieldValue = " + fieldValue); 

     bigBooleanField.setAccessible(true); 
     bigBooleanField.setBoolean(testVO1, new Boolean(true)); 

     // get the value of this private field 
     fieldValue = (Boolean) bigBooleanField.get(testVO1); 
     System.out.println("fieldValue = " + fieldValue); 

    } 
} 

輸出是:

SmallBoolean fieldName的是:smallBoolean fieldValue = false fieldValue = true bigBooleanField Fieldname is:bigBoolean fieldValue方法= NULL 異常在線程 「主」 java.lang.IllegalArgumentException異常:不能sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)設置一個java.lang.Boolean場TestVO.bigBoolean到(布爾)真 在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:175) 在sun.reflect.UnsafeObjectFieldAccessorImpl.setBoolean(UnsafeObjectFieldAccessorImpl.java:90) 在java.lang.reflect.Field.setBoolean(Field.java:795) 在TestClass.main(TestClass.java:44)


我試圖設置用new Boolean(true),Boolean.TRUE,true等的bigBoolean值無效。請幫忙。

回答

3

根據this,調用bigBoolean.setBoolean()來設置引用類型爲Boolean的字段,其值爲原始類型。在非反射等價布爾值val = true中,編譯器將原始類型「true」轉換(或框)爲一個引用類型爲new Boolean(True),以便其類型檢查將接受該語句。 使用反射時,類型檢查僅在運行時發生,因此沒有機會填充值。這種力量拋出IllegalArgumentException由於不可轉換類型

+0

感謝您的詳細解答和解決方案。 +1。 –

0

我面臨同樣的問題,原因是不反射的原因是getter方法類型。如果您注意到布爾值/布爾值,則您的IDE將創建一個getter方法,如同isVariableName()而不是getVariableName()。如果你改變你的方法名稱來獲得類型,它會正常工作。