Как получить текущее значение поля в Activity при использовании DexClassLoader? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть поле в MainActivity, подобное этому

public class MainActivity extends AppCompatActivity {

private static String field = "abc";

private void setField(Intent intent) {
    String field2;
    if (intent != null && (field2 = intent.getStringExtra("field")) != null) {
        field = field2;

    }
}

/* access modifiers changed from: protected */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView((int) R.layout.activity_main);
    setField(getIntent());
....

, и я загружаю метод из файла Dex с этим кодом

Class<?> classToLoad = new DexClassLoader(codeFile.getAbsolutePath(), tmpDir.getAbsolutePath(), (String) null, ClassLoader.getSystemClassLoader()).loadClass("com.example.MyClass");
        Method method = classToLoad.getDeclaredMethod("run", new Class[0]);
        method.invoke(classToLoad, new Object[0]);

Итак, в run () метод, как я могу получить текущее значение поле ? Спасибо!

public static void run()  {
    // How?

}

1 Ответ

0 голосов
/ 29 апреля 2020

Я нашел решение, используя getContextClassLoader

Class clazz = callerClasses.loadClass("com.example.MainActivity");       
Fields field = new Fields();
Field field= clazz.getDeclaredField("field");
flag.setAccessible(true);
Log.d(TAG, "field: " + flag.get(field));

Какой «Поля» является внутренним классом в коде Dex

private static class Fields {

    private static String field = "test";
}
...