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方法中完成脱壳工作?
网友评论