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

时间:2016-01-10 05:31:33

标签: java android reflection dalvik

虽然有类似的问题(例如ABC),但他们的答案并不能解决我的问题。

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

2 个答案:

答案 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