美图镇楼
编写的java文件最终被编译为class文件,在运行期间将class文件加载到方法区,对文件流进行校验解析初始化,最终成为可以使用的java对象。Class文件加载到内存到从内存卸载经历了这些阶段:加载、连接、初始化、使用、卸载。其中连接有分为验证、准备、解析三个阶段,如下图。
类加载过程
我们重点研究下加载、连接、初始化这三个过程中发生了什么。
一、使用类加载器加载class文件
先让我们自定义一个类加载器,并初始化这个class对象,来初步体验下类加载到使用的过程,首先实现一个简单的class类
publicclassMgDemoSample{
publicvoidstartSample()
{
System.out.println(MgDemoSample);
}
}
使用javacMgDemoSample.java编译出class文件,将class文件放到E:/cltmp/目录下,然后创建一个URLClassLoader加载MgDemoSample,并实例化对象,通过反射执行startSample这个函数
URLurl=newURL(file:/E:/cltmp/);
URLClassLoaderloader=newURLClassLoader(newURL[]{url});
Classcl=loader.loadClass(MgDemoSample);
log.info(....{},cl.getName());
Objectinstance=cl.newInstance();
MethodmainMethod=cl.getMethod(startSample);
注意:如果报错Cantinitializejavacprocessordueto(mostlikely)aclassloaderproblem:java.lang.NoClassDefFoundError: