Dalvik 下的 Class.forName() 方法

Android安全交流群:478084054

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

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

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

Dalvik 下的 Class.forName() 方法_第1张图片

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

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

Dalvik 下的 Class.forName() 方法_第2张图片

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

Dalvik 下的 Class.forName() 方法_第3张图片

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

Dalvik 下的 Class.forName() 方法_第4张图片

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

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

Dalvik 下的 Class.forName() 方法_第5张图片

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

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

Dalvik 下的 Class.forName() 方法_第6张图片

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

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

你可能感兴趣的:(Dalvik 下的 Class.forName() 方法)