Java 17 mit Reflexionsbeschränkungsmodifikatoren Java.lang.NosuchfieldException: ModifikatorenAndroid

Forum für diejenigen, die für Android programmieren
Guest
 Java 17 mit Reflexionsbeschränkungsmodifikatoren Java.lang.NosuchfieldException: Modifikatoren

Post by Guest »

Ich muss ein Gerät von 16 KB Seitengröße in Android 35 unterstützen. Um 16 KB -Seitengröße zu unterstützen, haben wir die AGP -Version auf die neueste 8.7 aktualisiert. Die Lates AGP -Version benötigt die Jave 17 -Version. Nach der Aktualisierung der Java 17 -Version für Projekten fehlschlagen die Testfälle jedoch, wo der Relektion zum Zugriff auf die privaten Variablen oder die private Methode verwendet wird. Es gibt so viele Legacy -Testfälle. Die Arbeit an diesen Testfällen erfordert viel Nacharbeit und Umgestaltung im Code, der aufgrund von Zeit- und Kosten -Kontrollunternehmen nicht möglich ist. Wie kann ich dieses Problem beheben, ohne auf Wieder zugerichtet zu sein?

Code: Select all

  fun getFinalPrivateVariable(clazz: Class, fieldName: String): Field {
val field = getPrivateVariable(clazz, fieldName)
val modifiers = Field::class.java.getDeclaredField("modifiers")
modifiers.isAccessible = true
modifiers.setInt(field, field.modifiers and Modifier.FINAL.inv())
return field
}
< /code>
Ich habe bereits versucht, in Gradle.Properties < /p>
unten hinzugefügt zu werden--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
< /code>
Es hat nicht funktioniert.android {
testOptions {
unitTests.all {
jvmArgs += [
'--add-opens=java.base/java.lang.reflect=ALL-UNNAMED',
'--add-opens=java.base/java.lang=ALL-UNNAMED'
]
}
}
}
< /code>
Außerdem versuchte es zu refactor < /p>
@Throws(Exception::class)
fun getFinalPrivateVariable(clazz: Class, fieldName: String): Field {
val field = getPrivateVariable(clazz, fieldName)
field.isAccessible = true

// Obtain a VarHandle for the "modifiers" field in the Field class
val modifiersHandle: VarHandle = MethodHandles.privateLookupIn(Field::class.java, MethodHandles.lookup())
.findVarHandle(Field::class.java, "modifiers", Int::class.javaPrimitiveType)

// Remove the FINAL modifier
val mods = modifiersHandle.get(field) as Int
modifiersHandle.set(field, mods and Modifier.FINAL.inv())

return field
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post