最近工作需要,要自己写一个自定义Classloader类。根据项目来讲一下Classloader 类相关内容。既然关于某某的内容,自然要有来源,道听途说的不要,直接上源码。这里源码主要用的是sun 的jdk,版本号是java 6。(其它版本,比如ibm 或者是oracle的不保证),另一部分是工作中遇到的问题。
好了,先讲一下java 内自带的几个主要的classcloader,一个是AppClassLoader,一个是ExtClassLoader,还有就是bootstrap class loader。前两个都在sun的Luncher 类内定义,都继承在URLClassLoader,而URLClassLoader 的祖先类便是大部分自定义类加载器要用到的ClassLoader类。AppClassLoader 也就是getSystemClassLoader获得的类。
AppclassLoader 的实现非常简单,使用了下securityManager就去调用ClassLoader 的loadClass 方法,这个方法,就是实现了所谓的双亲委派方式,先调一下父加载器,如果没有就去找boot strap 是不是加载了class,如果都没有,那么就自己加载。
那关键就是urlClassLoader,这个类主要是从url资源中(对于appclassloader就是classpath上资源)找到classname对应的class。这里插个题外话,对于appClassloader如果两个不过版本的jar出现的classpath,并且有重名名class会怎么样呢?分析下urlClassLoader 代码不能发现,结果是urlclassLoader 先找个哪个算哪个。囧了。
这些从代码上看过来的,在说一下项目里的问题,自己定义了一个classLoader 继承自ClassLoader 类,class 是直接是本地文件,不在classpath上。这个文件里包含三个class 类。一个外部类,两个内部类。一开始并没有把这个文件对应的java文件 去掉,老是报类重定义,去掉了,结果是一个内部类找不到。什么情况?类加载是通过classloader 独立进行的吗?classLoader不是可以当做命名空间来用吗?怎么看,这里显然是调了appclassloader。 看了下源码发现原来ClassLoader 类默认构造函数,会把appclassloader当父加载器设摄入
this(checkCreateClassLoader(), getSystemClassLoader());
}
而我的那个classLoader 也只实现了默认构造函数。那么自定义那个做不到类,自然会从父加载器加载,父加载器已经加载了,在加载同一个class 自然会报错。
好吧:
总结一下,第一,所有的classloader 都是出自ClassLoader类,如果你不想经过父加载器 和bootstrap,也可以重写loadClass方法(不建议)
第二,classloader 的调用是通过parent 进行的链式调用,要指定从哪一个环节开始,要在构造函数中显示指定。
相关推荐
总的来说,防止Java源码被偷窥的关键在于理解并利用Java的ClassLoader机制,结合加密技术,可以在不改变程序功能的前提下增强源码的安全性。通过自定义ClassLoader并实现即时解密,可以有效地保护代码免受反编译器的...
3. **Java源码解析**:理解Java源码对于深入学习动态创建至关重要。源码分析可以帮助我们理解类加载器的工作原理、类的生命周期以及如何通过编译后的字节码进行操作。这包括对`.class`文件的理解,以及`javap`命令的...
它继承自Java的ClassLoader,能解析Groovy源码并生成字节码。 3. 加载并执行Groovy脚本:通过GroovyClassLoader的`parseClass()`方法解析Groovy源码,然后使用`newInstance()`方法创建脚本实例,最后通过`...
总的来说,Tomcat 5.0.18的ClassLoader源码是Java Web开发人员的一份宝贵教材,它揭示了类加载器如何在复杂的Web环境中工作,以及如何维护应用的隔离性和安全性。通过深入研究,我们不仅可以提升自己的技术能力,也...
- **Java源码到字节码的转换**:Java源代码首先会被编译器转换为一种称为“字节码”(bytecode)的中间代码形式,存储在`.class`文件中。这个过程使得Java程序可以脱离具体的平台限制。 - **平台独立性**:Java字节...
最后,Druid的源码中还体现了多种语言特性,比如Interface和Abstract的使用,FunctionP的实现,ClassLoader的运用,以及ThreadExecutes和ThreadLocal的应用。这些语言特性的应用有助于构建出高效和线程安全的代码。 ...
1. **类文件加密**:通过加密技术将Java类文件加密,使得普通的反编译工具无法正常解析。 2. **动态解密**:在运行时动态地对加密过的类文件进行解密,确保解密后的代码只在内存中短暂存在。 3. **自定义类加载器**...
三、重点源码解析 1. 集合框架:Java 1.8引入了Stream API,使得集合操作更加简洁和高效,通过lambda表达式和方法引用来实现函数式编程。 2. Lambda表达式:Java 1.8引入的新特性,简化了匿名内部类的创建,提高了...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。...结合源码和适当的工具,我们可以更好地理解和利用这一特性。
这篇博客探讨了如何结合Classloader实现热部署。 首先,理解类加载器的工作机制至关重要。Java中的类加载分为五个阶段:加载、验证、准备、解析和初始化。每个类加载器都有自己的命名空间,避免了类名冲突。Java的...
总之,Java源码学习与JVM解析是Java开发者的必修课,它们提供了深入洞察Java运行机制的窗口,有助于提升编程技能,解决实际问题,并优化应用性能。通过不断学习和实践,开发者可以成为Java领域的专家,从而在IT行业...
《深入解析JDK8源码》 在编程领域,理解JDK源码对于提升技术水平、优化代码以及解决复杂问题至关重要。...在日常开发中,结合源码学习,可以解决许多看似无解的问题,使我们成为更优秀的Java程序员。
本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...
总之,"jvm虚拟机源码学习资料"提供了一个全面了解JVM内部运作的窗口,结合cglib库的实践,将帮助Java开发者提升技术水平,更好地驾驭这个复杂的运行环境,解决实际开发中的各种问题。通过深入学习,不仅可以提升...
- **源码解析**:通过对Netty源码的详细解析,掌握其高效并发处理能力的关键技术点。 #### 7. 架构师不得不知道的Spring事务不能回滚的深层次原因 - **事务管理**:回顾Spring框架中事务管理的基本概念和实现机制...
《深入解析Java HotSpot虚拟机源码:JDK8u262版》 Java HotSpot虚拟机作为Oracle JDK的核心组成部分,一直以来都是Java开发者研究和优化的重要对象。HotSpot源码的开放,为开发者提供了深入理解Java运行机制的宝贵...
本篇将详细介绍如何利用枚举(enum)来实现单例模式,并结合`Properties`类解析配置文件。 首先,我们来看一下传统的单例模式实现方式,如懒汉式和饿汉式,但这些方法在多线程环境下可能会存在问题。而使用枚举实现...
通过对Android 7.1.1的ClassLoader源码分析,我们可以看到,当类首次加载时,会依次检查已加载的类、父ClassLoader,最后才调用自身的findClass方法。 PathClassLoader的findClass方法中,系统没有过多涉及...
《深入理解Java虚拟机:Java高级特性与最佳实践》是一本深受Java开发者喜爱的经典书籍,它详尽地探讨了Java虚拟机(JVM)的工作原理和优化策略,同时结合源码分析,帮助读者掌握Java编程的深层知识。在这个名为"jvm_...
Java源码解析是每个Java开发者进阶的必经之路,它可以帮助我们理解程序运行的底层原理,提升编程技能。"misc:学习与工作中收集的一些资料"这个压缩包可能包含了一系列与Java源码解读相关的资源,比如核心库的源码...