0x00 在DexClassLoader和PathClassLoader载入Dex流程一文中,我们分析了dex文件怎样形成了DexFile结构体.本文中解说类载入机制,实际上就是生成ClassObject对象. 我们以DexClassLoader为例.解说类载入机制,PathClassLoader是一样的. 我们在载入类时一般会调用loadClass,那么我们就从loadClass来開始分析. 0x01 DexClassLoader类没有loadClass方法.所以调用的是父类ClassLoad…
作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP.HTTP等等协议可能就是底层:对于C.C++程序猿.内存.指针等等可能就是底层的东西.那对于Java开发人员,你的Java代码执行所在的JVM可能就是你所须要去了解.理解的东西. 我会在接下来的一段时间,和读者您一起去学习JVM,全部内容均參考自<深入理解Java虚拟机:JVM高级特性与最佳实践>…
深入研究Java类载入机制   类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载入,比方热部署等,提高程序的灵活性和适应性.   一.简单过程   Java程序执行的场所是内存,当在命令行下执行: java HelloWorld 命令的时候,JVM会将HelloWorld.class载入到内存中,并形成一个Class的对象HelloWorld.class. 当中的过程就是类载入…
Java虚拟机类载入过程是把Class类文件载入到内存.并对Class文件里的数据进行校验.转换解析和初始化,终于形成能够被虚拟机直接使用的java类型的过程. 在载入阶段,java虚拟机须要完毕下面3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流. b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的执行时数据结构. c.在java堆中生成一个代表该类的java.lang.Class对象,作为方法区数据的訪问入口. Java虚拟机的类载入是通过类载入器实现的, Java中…
前几日使用 Jetty (9.2)部署公司一个 web 项目,这个项目原本部署在 Tomcat server上,一切正常,可是部署到 Jetty 后,启动报错.关键错误信息为"java.lang.NoClassDefFoundError: Could not initialize class org.apache.tomcat.jdbc.pool.DataSource" 项目使用了 Tomcat jdbc connection pool 当中有两个 jar 包 tomcat-jdbc.…
0x00 在上一篇文章apk安装和优化原理,在最后我们分析了DexClassLoader和PathClassLoader的构造函数的不同. PathClassLoader最后调用的是new DexFile(pathFile),而DexClassLoader调用的是DexFile.loadDex(dexPathList[i], outputName, 0). 0x01 new DexFile(pathFile)相应的代码位于libcore\dalvik\src\main\java\dalvik\s…
要说Tomcat的Classloader机制,我们还得从Bootstrap開始.在BootStrap初始化的时候.调用了org.apache.catalina.startup.Bootstrap#initClassLoaders方法,这种方法里面创建了3个ClassLoader,它们各自是commonLoader,catalinaLoader,sharedLoader,当中catalinaLoader,sharedLoader的父亲载入器是commonLoader,initClassLoader…
Android的ClassLoader体系 在Android中可以跟java一样实现动态加载jar,但是Android使用Dalvik VM,不能直接加载java打包jar的byte code,需要通过dx工具来优化Dalvik byte code Android在API中给出可动态加载的有:DexClassLoader 和 PathClassLoader. DexClassLoader:可加载jar.apk和dex,可以从SD卡中加载PathClassLoader:只能加载已安装到系统中(即/…
  用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想办法来找到这个类,在这样的清理下我们须要自己实现一个ClassLoader. 确保安全性:Java字节码非常easy被反编译,对我们自己的要载入的类做特殊处理,如保证通过网络传输的类的安全性.能够将类经过加密后再传输,在加密到JVM之前须要对类的字节码在解密.这个过程就能够在自己定义的ClassLo…
目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定义类加载器:深入理解,对于理解编译原理也有很大帮助. 二.了解类装载机制,在我们项目开始中的应用 在项目中,我们可以使用自定义类加载器,可以帮助我们做如下操作: (1)加密.java代码很容易被反编译,如果你需要把自己的代码进行加密,可以先将编译后的代码用某种加密算法加密,然后实现自己的类加载器,负…