简体   繁体   中英

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

I have following java class with static final int which I need to change via reflection:

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

And from Android Kotlin I try to change it value from 20 to 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}")

    }

And I have following output in Logcat:

@@@@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

Perhapse reflection doesn't work with primitive int?

with this library just use this:

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

static final is like const val in Kotlin, that variable can't change.

DateValidator class is declare DIFF is static. so it can't change

you can read this article

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM