来自深入java虚拟机的介绍,关于JVM加载class的原理,主要有几个重点。
1. ClassLoder的种类
内置的ClassLoader有3种,一是BootstrapClassLoader,这是根loader,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等;二是ExtensionClassLoader,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar;三是AppClassLoader:负责加载应用程序classpath目录下的所有jar和class文件。
2.双亲委派
逻辑是,每当要加载一个类时,都会先让父加载器先加载来避免一些安全问题
关键源码:
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
3.一个有意思的例子
在同一个项目中,同时引用两个定义了Class Test的jar包,调用的时候发现,只有其中一个jar包会在编译中起作用,原因就是加载器在加载的时候会总是发现Test类已经被加载了,而忽略另外的Test类,删掉起作用的jar包之后,另一个Test类才能起作用,从另外一个角度上说,包名相同类名也相同的情况,应该在实践中绝对避免。
4.动态加载的class类
观察Class.forName()方法的源码,发现它的实现是调用了一个本地方法,查找资料得知,这里的本地方法,应该是通过加载器的loadClassInternal方法来找对应的类,而这一步,就回到了上述的双亲委派的过程了。
5.自定义的加载器
要自定义加载器,主要是要实现findClass方法,不管用什么方式,从网络也好,从文件也好,找到Class文件,序列化成字节流后通过defineClass方法来把字节流变成一个Class对象,返回到加载器,这个类的加载的流程就完成了。
分享到:
相关推荐
Java的动态加载机制是其设计的一大亮点,它允许程序在运行时按需加载类,而不是一次性加载所有类。这种机制降低了内存消耗,并提高了程序的灵活性。当我们编写Java程序并运行时,只有当我们实际创建一个类的实例或者...
总的来说,这本书将引导读者进行一次深度的Java技术探索之旅,通过对JVM、Classpath、ClassLoader和import等关键知识点的深入学习,提升开发者对Java平台的理解,从而更好地应对复杂软件开发挑战。
类的加载并不在程序启动时一次性完成,而是只有当实际使用到某个类的实例时,才会执行加载。这种方式提高了程序的效率,因为未使用的类不会占用额外的内存资源。 2. 寻找class文件的原理: Java类的查找依赖于类...
所有类文件并非一次性全部加载,而是按需加载,即动态加载。Java的类加载器包括Bootstrap ClassLoader(加载JVM核心类)、Extension ClassLoader(加载JRE扩展目录的类)和Application ClassLoader(加载应用类路径...
- 当进入`CodeItem`之前,需要进行一次dump操作。 - ART环境下,对于异常处理方面的特殊处理需要注意`triesSize`在7~8字节的位置。 2. **解析CodeItem**: - `0003Gda`代表的是对某个类的列表进行解析。 - 在...
这就是为什么我们常说"同一个类在不同的类加载器中可以加载多次"。 此外,类加载器的生命周期管理也是一个需要注意的点。不正确的类加载器管理可能导致内存泄漏。当一个类加载器不再使用时,如果没有其他引用指向它...
OSGi的实现有助于实现“一次编写,到处运行”的梦想,即在遵循OSGi规范的平台之间,应用组件具有更好的移植性和复用性。 OSGi技术的关键特征包括: 1. 模块化:通过将应用程序分割成独立的模块(称为bundle)来实现...
Java语言设计上强调“一次编写,到处运行”(Write Once, Run Anywhere, WORA),它允许开发者编写一次代码,然后在多种平台上运行,而无需重新编译。Java分为多个版本,包括Java SE(标准版)、Java EE(企业版)和...
3. **独立性**:Java类文件不依赖于特定的操作系统或硬件架构,这使得Java能够实现“一次编写,到处运行”的目标。 类文件的这种设计原则使得Java能够在各种不同的平台上运行,而不需要对代码本身进行任何修改。 #...
Java的特点之一是其跨平台性,即“一次编写,到处运行”(Write Once, Run Anywhere)。这是因为Java代码会被编译成字节码,然后由Java虚拟机(JVM)解释执行。JVM是Java技术的核心,它负责加载、验证、执行类文件,...
Tinker V1.0作为初代版本,主要是对热补丁技术的一次尝试,其设计目标是解决类加载器的问题。然而,V1.0版本在启动耗时、Art平台补丁后无法启动等问题上存在缺陷,这些问题主要是因为Android平台的差异性导致的。在...
总之,《阿里巴巴内部技术资料汇编》是一份不可多得的资源,它揭示了互联网巨头在技术领域的创新与实践,对于任何希望深入了解和应用热修复技术,以及提升整体技术水平的IT人士来说,都是一次难得的学习机会。
《深入解析Java JDK 1.8 rt.jar源码》 ...这是一次对Java语言本质的探索,也是一次对编程思想的升华。因此,无论你是初学者还是经验丰富的开发者,都应该尝试去研读和理解这些源码,让它们成为你编程道路上的灯塔。
面对前后端多个团队共同开发同一个App时的方法数限制(65535)问题,"Spider"采取了组件化策略,通过更细粒度的ClassLoader管理Atom,确保了不同团队之间的完全解耦,每个团队可以独立进行开发和构建,极大地提升了...
【计算机专业、信计专业毕业实习报告】 ...总结,本次实习是一次全面的实践学习体验,不仅强化了专业知识,也增强了实际操作能力,为即将踏入职场的计算机与信息计算科学专业的毕业生提供了宝贵的实践经验。
总的来说,libloader-0.3.7.Jar的源码分析是一次深入了解Java本地库加载机制的旅程。通过深入学习,开发者不仅可以提升自己的编程技巧,还能更好地应对实际项目中涉及本地库集成的问题,从而提高软件的性能和灵活性...
1. **Java编程基础**:Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而闻名。在这个项目中,开发者利用Java的类、对象、接口等概念构建了游戏的框架。 2. **图形用户界面(GUI)**:...
其次,Arthas的Classloader Inspector是一个强大的利器,它允许开发者查看和分析类加载器的结构以及类的加载过程。这对于解决"ClassNotFoundException"或类加载相关的复杂问题非常有帮助。开发者可以通过`cl`命令来...
而小对象则可能在Eden区快速分配,经历一次或多次Minor GC后晋升到老年代。如果对象在 Eden 区分配失败,且Survivor区也无法容纳,就会触发Full GC,这通常是性能问题的潜在信号。 通过JDK源码分析,我们可以了解到...