Код: Выделить всё
// This code works on a standard OpenJDK JVM
try {
String testString = "Hello, OpenJDK!";
Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
byte[] value = (byte[]) valueField.get(testString);
System.out.println("OpenJDK: Successfully accessed 'value' field.");
} catch (Exception e) {
e.printStackTrace();
}
< /code>
Однако этот тот же подход не работает на современных устройствах Android, работающих во время выполнения искусства. Это приводит к моим основным вопросам:
[b] Какова новая внутренняя реализация java.lang.string Моя конечная цель состоит в том, чтобы избежать копий памяти во время чувствительных к производительности операций анализа. Class = "Lang-Java PrettyPrint-Override">
Код: Выделить всё
// This code fails on modern Android
try {
String testString = "Hello, ART!";
Field valueField = String.class.getDeclaredField("value"); // This line throws
valueField.setAccessible(true);
// ...
} catch (NoSuchFieldException e) {
// This exception is caught
Log.e("StringReflection", "Failed to find 'value' field", e);
}
I expected this code to execute successfully and give me a Field object corresponding to the internal value array of the String, allowing me to read its contents directly.
What actually resulted:
The Код бросил java.lang.nosuchfieldexception в строке GetDeclaredField ("value") . Полное сообщение об ошибке: < /p>
Код: Выделить всё
java.lang.NoSuchFieldException: No field value in class Ljava/lang/String; (declaration of 'java.lang.String' appears in /apex/com.android.art/javalib/core-oj.jar)
Подробнее здесь: https://stackoverflow.com/questions/797 ... ndroid-art
Мобильная версия