虽然有类似的问题(例如A,B和C),但他们的答案并没有解决我的问题.
我使用Android Studio 1.5.1定位Android API 18(在Android KitKat 4.4之前,所以我正在处理Dalvik,而不是ART运行时).
我的问题是:
(1)当我使用下面的代码时,我可以打印所有sun.misc.Unsafe methods available in Android的列表,所以我想我可以使用反射访问它们,但我不知道如何使用反射调用它们.
(2)如果(1)是可能的,如何在Android中通过反射使用sun.misc.Unsafe方法找到magicNumber(在下面的代码中)地址?
(3)如果(1)是可能的但是(2)是不可能的,如何在任何本地存储器地址中放入一个整数(比如int test = 123)并使用Android中的sun.misc.Unsafe方法打印其存储器地址反射?
String ClassName = "sun.misc.Unsafe";
int magicNumber = 0x23420023 ;
try {
Class classToInvestigate = Class.forName(ClassName);
Constructor[] aClassConstructors = classToInvestigate.getDeclaredConstructors();
for(Constructor c : aClassConstructors){
System.out.println("********************* constructor="+c);
}
Method[] aClassMethods = classToInvestigate.getDeclaredMethods();
for(Method m : aClassMethods){
System.out.println("********************* method="+m);
}
Field theUnsafe = classToInvestigate.getDeclaredField("THE_ONE");
theUnsafe.setAccessible(true);
Object unsafe = theUnsafe.get(null);
} catch (ClassNotFoundException e) {
// Class not found!
}
catch (Exception e) {
// Unknown exception
}
解决方法:
不幸的是sun.misc.Unsafe类没有包含在android标准库中,你应该在反射之间使用它,但是我找到了另一个解决方案:在我的库中预编译的直接代理类之间使用它:https://github.com/iamironz/unsafe