2017-03-04 5 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フィールド名は次のとおりです。smallBoolean fieldValue = false fieldValue = true bigBooleanFieldフィールド名:bigBooleanスレッド "メイン" java.lang.IllegalArgumentExceptionがでfieldValueの= nullを 例外:sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)で(論理値)true にjava.lang.BooleanのフィールドTestVO.bigBooleanを設定できませんjava.lang.reflect.Field.setBooleanでsun.reflect.UnsafeObjectFieldAccessorImpl.setBoolean(UnsafeObjectFieldAccessorImpl.java:90) (Field.java:795)でsun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:175) でiが設定しようTestClass.main(TestClass.java:44)


で 新しいBoolean(true)、Boolean.TRUE、trueなどのbigBoolean値は機能しません。助けてください。

答えて

3

thisによると、bigBoolean.setBoolean()が呼び出されて参照型のブール値のフィールドがプリミティブ型の値に設定されます。非反射同等のブール値val = trueでは、コンパイラはプリミティブ型 'true'を新しいブール値(True)として参照型に変換して、その型チェックがそのステートメントを受け入れるようにします。 リフレクションを使用している場合、型チェックは実行時にのみ行われるため、値を入力する機会はありません。これはInconvertible型のためIllegalArgumentExceptionをスローするように強制します

+0

詳細な回答と解決策をお寄せいただきありがとうございます。 +1。 –

0

私は同じ問題に直面していました。 boolean/Booleanの場合は、getVariableName()の代わりにisVariableName()のようにgetterメソッドを作成します。メソッド名を型に変更すると、正常に動作します。

関連する問題