Android安全交流群:478084054
调用Class.forName()方法可以显示加载一个类,主要用于反射。
该方法定义在“/libcore/libdvm/src/main/java/java/lang/Class.java”文件中:
![](https://img.haomeiwen.com/i20238/12938db4594cd23b.png)
该方法调用Class类的另一个三参数版本的forName方法,第2个参数设为true,表示加载类时需要初始化。第3个参数传入一个类加载器。
![](https://img.haomeiwen.com/i20238/e338ce063df8ca3b.png)
该函数调用Class类的classForName方法来完成类加载工作,这是一个native函数:
![](https://img.haomeiwen.com/i20238/8389708012abf854.png)
它的实现在“/dalvik/vm/native/java_lang_Class.cpp”文件中:
![](https://img.haomeiwen.com/i20238/c8456c0cd7236911.png)
继续调用dvmFindClassByName方法来进行类加载工作,该方法在“/dalvik/vm/native/InternalNative.cpp”文件中。
![](https://img.haomeiwen.com/i20238/058712c1df33213c.png)
由上面的分析可知,参数doInit为true,所以是调用dvmFindClass来完成类加载工作,该函数定义在“/dalvik/vm/oo/Class.cpp”文件中。
![](https://img.haomeiwen.com/i20238/b2adca731d7a2d4d.png)
在dvmFindClass函数中先调用dvmFindClassNoInit加载类,再调用dvmInitClass初始化类。
dvmFindClassNoInit函数的实现也在“/dalvik/vm/oo/Class.cpp”文件中。
![](https://img.haomeiwen.com/i20238/119cd3f6abd1db8d.png)
因为参数loader不为NULL,所以调用findClassFromLoaderNoInit函数加载类,并将loader作为参数传入。
findClassFromLoaderNoInit函数的实现还是在“/dalvik/vm/oo/Class.cpp”文件中,这里只贴出关键代码,它实际是调用参数loader的loadClass方法来加载类的。
![](https://img.haomeiwen.com/i20238/a79cf9c256819250.png)
关于ClassLoader的loadClass方法可以参考:http://www.jianshu.com/p/c83435189428。
了解这些类加载相关的知识对dex脱壳颇有帮助,比如DexHunter为什么是在defineClassNative方法中完成脱壳工作?
网友评论