美文网首页
Dalvik 下的 Class.forName() 方法

Dalvik 下的 Class.forName() 方法

作者: 十八垧 | 来源:发表于2017-03-26 21:31 被阅读230次

    Android安全交流群:478084054

    调用Class.forName()方法可以显示加载一个类,主要用于反射。

    该方法定义在“/libcore/libdvm/src/main/java/java/lang/Class.java”文件中:

    该方法调用Class类的另一个三参数版本的forName方法,第2个参数设为true,表示加载类时需要初始化。第3个参数传入一个类加载器。

    该函数调用Class类的classForName方法来完成类加载工作,这是一个native函数:

    它的实现在“/dalvik/vm/native/java_lang_Class.cpp”文件中:

    继续调用dvmFindClassByName方法来进行类加载工作,该方法在“/dalvik/vm/native/InternalNative.cpp”文件中。

    由上面的分析可知,参数doInit为true,所以是调用dvmFindClass来完成类加载工作,该函数定义在“/dalvik/vm/oo/Class.cpp”文件中。

    在dvmFindClass函数中先调用dvmFindClassNoInit加载类,再调用dvmInitClass初始化类。

    dvmFindClassNoInit函数的实现也在“/dalvik/vm/oo/Class.cpp”文件中。

    因为参数loader不为NULL,所以调用findClassFromLoaderNoInit函数加载类,并将loader作为参数传入。

    findClassFromLoaderNoInit函数的实现还是在“/dalvik/vm/oo/Class.cpp”文件中,这里只贴出关键代码,它实际是调用参数loader的loadClass方法来加载类的。

    关于ClassLoader的loadClass方法可以参考:http://www.jianshu.com/p/c83435189428

    了解这些类加载相关的知识对dex脱壳颇有帮助,比如DexHunter为什么是在defineClassNative方法中完成脱壳工作?

    相关文章

      网友评论

          本文标题:Dalvik 下的 Class.forName() 方法

          本文链接:https://www.haomeiwen.com/subject/rczkottx.html