Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中,如何使用Java反射调用sun.misc.Unsafe方法?_Java_Android_Reflection_Dalvik - Fatal编程技术网

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

在Android中,如何使用Java反射调用sun.misc.Unsafe方法?,java,android,reflection,dalvik,Java,Android,Reflection,Dalvik,虽然也有类似的问题(如、和),但他们的答案并不能解决我的问题 我使用的是针对Android API 18的Android Studio 1.5.1(在Android KitKat 4.4之前,所以我使用的是Dalvik,而不是ART runtime) 我的问题是: (1) 当我使用以下代码时,我可以打印所有代码的列表,因此我认为我可以使用反射访问它们,但我不知道如何使用反射调用它们 (2) 如果(1)是可能的,如何通过反射在Android中使用sun.misc.Unsafe方法查找magicNu

虽然也有类似的问题(如、和),但他们的答案并不能解决我的问题

我使用的是针对Android API 18的Android Studio 1.5.1(在Android KitKat 4.4之前,所以我使用的是Dalvik,而不是ART runtime)

我的问题是:

(1) 当我使用以下代码时,我可以打印所有代码的列表,因此我认为我可以使用反射访问它们,但我不知道如何使用反射调用它们

(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
    }

这个类将返回几乎所有现有JVM实现(包括Android(两个VM版本))上的不安全实例:

不幸的是,
sun.misc.Unsafe
类未包含在android标准库中,您应该在反射之间使用它,但我找到了另一个解决方案:在我的库中预编译的直接代理类之间使用它:

我在
Unsafe
中没有看到任何方法可以让您获得局部变量的地址,我看不出你提到的任何问题的相关性,特别是C#one。你能给出如何使用Android Studio在我的应用程序中包含UnsafeUtil.java的步骤吗?我的意思是,我是否需要将其复制到某个文件夹中,以及如何将其包含在我的Android Studio项目中?只需将源代码复制到某个类中,将源代码复制到某个类中不起作用,在Android Studio中会出现三个错误:(1)意外标记:package com.noctarius.tengi.core.impl;(2) 无法解析符号:import com.noctarius.tengi.core.model.Identifier;和(3)无法解析符号:import sun.misc.Unsafe;如果我删除了import sun.misc.Unsafe这一最重要的项目,那么一切都不起作用。我很确定,Android Studio应该“阻止”访问sun.misc.Unsafe。你试过在命令行上编译吗?