Java 17 с модификаторами ограничения отражения java.lang.nosuchfieldexception: модификаторыAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Java 17 с модификаторами ограничения отражения java.lang.nosuchfieldexception: модификаторы

Сообщение Anonymous »

Я должен поддержать устройство размера 16 КБ в Android 35. Чтобы поддержать устройства размера 16 КБ, мы обновили версию AGP до последнего 8.7. Версия Lates AGP требует версии Jave 17. Однако после обновления версии Java 17 для проекта тестовые примеры выходят из строя, где бы ни использовалось, чтобы получить доступ к частным переменным или методу. Есть так много унаследованных тестовых случаев. Работа над этими тестовыми случаями потребуется много переделки и рефакторирования в коде, что невозможно из -за временного и затрат. Как я могу решить эту проблему без рефакторинга. < /P>
Код, который вызывает проблему < /p>
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>
Я уже пытался добавить ниже строки в gradle.properties < /p>
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
< /code>
Это не сработало. < /p>
также попытался добавить в build.gradle < /p>
android {
testOptions {
unitTests.all {
jvmArgs += [
'--add-opens=java.base/java.lang.reflect=ALL-UNNAMED',
'--add-opens=java.base/java.lang=ALL-UNNAMED'
]
}
}
}
< /code>
также попытался рефактор < /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
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... ception-mo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»