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