美文网首页
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