在Android中,如何使用Java反射调用sun.misc.Unsafe方法?

虽然有类似的问题(例如A,BC),但他们的答案并没有解决我的问题.

我使用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

上一篇:在Android应用程序中使用混合Java / Ruby代码?


下一篇:本机代码可以导致Android中Java代码中的内存损坏吗?