簡體   English   中英

為什么我不能通過 kotlin android 的反射來更改 static 最終 int 字段

[英]Why I cannot change static final int field with reflection from kotlin android

我關注 java class 和 static final int 我需要通過反射改變:

class DateValidator {
   public static final int DIFF = 20;
}

從 Android Kotlin 我嘗試將其值從 20 更改為 100:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        println("@@@@DateValidator.DIFF: ${DateValidator.DIFF}")
        val clazz = DateValidator::class.java
        println("@@@clazz: $clazz")
        val field: Field = clazz.getDeclaredField("DIFF")
        println("@@@field: $field")
        println("@@@field.isAccessible: ${field.isAccessible}")
        field.isAccessible = true
        println("@@@field.isAccessible2: ${field.isAccessible}")
        val fieldAccessFlags: Field = Field::class.java.getDeclaredField("accessFlags")
        println("@@@fieldAccessFlags: $fieldAccessFlags")
        println("@@@fieldAccessFlags.isAccessible: ${fieldAccessFlags.isAccessible}")
        fieldAccessFlags.isAccessible = true
        println("@@@fieldAccessFlags.isAccessible2: ${fieldAccessFlags.isAccessible}")
        fieldAccessFlags.setInt(field, field.modifiers and Modifier.FINAL.inv())
        field.set(null, 100)
        println("@@@@DateValidator.DIFF2: ${DateValidator.DIFF}")
        field.setInt(null, 100)
        println("@@@@DateValidator.DIFF3: ${DateValidator.DIFF}")

    }

我在 Logcat 中關注了 output:

@@@@DateValidator.DIFF: 20
@@@clazz: class com.droiddevstar.changestaticprj.DateValidator
@@@field: public static final int com.droiddevstar.changestaticprj.DateValidator.DIFF
@@@field.isAccessible: false
@@@field.isAccessible2: true
@@@fieldAccessFlags: private int java.lang.reflect.Field.accessFlags
@@@fieldAccessFlags.isAccessible: false
@@@fieldAccessFlags.isAccessible2: true
@@@@DateValidator.DIFF2: 20
@@@@DateValidator.DIFF3: 20

也許反射不適用於原始int?

使用這個庫只需使用這個:

reflection.FieldReflection.setFieldValue(field, null, 100);

static final就像 Kotlin 中的const val一樣,該變量無法更改。

DateValidator class 聲明DIFF為 static。 所以它不能改變

你可以閱讀這篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM