虽然有类似的问题(例如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)并使用sun.misc.Unsafe方法打印其存储器地址在Android中通过反射?
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
}
答案 0 :(得分:1)
不幸的是sun.misc.Unsafe
类没有包含在android标准库中,你应该在反射之间使用它,但是我找到了另一个解决方案:在我的库中预编译的直接代理类之间使用它:https://github.com/iamironz/unsafe
答案 1 :(得分:-3)
此类将在几乎所有现有JVM实现(包括Android(两个VM版本))上返回一个Unsafe实例:https://github.com/noctarius/tengi/blob/master/java/tengi-core/src/main/java/com/noctarius/tengi/core/impl/UnsafeUtil.java