1. 从一个简单小实验开始:
(1) Eclipse下建一简单Java project,写一个简单程序,如下:
package com.javaeye.loader;
public class URLClassLoaderTest {
public void show() {
System.out.println("I am running...");
}
}
(2) 到项目对应bin/com/javaeye/loader下找到URLClassLoaderTest.class文件,将此文件保存,然后删除整个project;
(3) 在磁盘任何位置建立文件夹com,在com里建立javaeye,在javaeye里建立loader,我建在C盘java目录下,建立完成后将(2)中保存的URLClassLoaderTest.class文件拷贝到其中,如下:
(4) 在非本地Apache Server上任何位置建立文件夹com,在com里建立javaeye,在javaeye里建立loader文件夹,完成后将(2)中保存的URLClassLoaderTest.class文件拷贝到其中,我的非本地计算机IP为192.168.66.250,系统为Linux Redhat, 建立完成后我们可以访问如下图:
(5) 给出两端端测试代码:
@Test
public void testInWeb() throws Exception{
URL[] urls = new URL[]{new URL("http://192.168.66.250/root/java/")};
URLClassLoader loader = new URLClassLoader(urls);
Class clas = loader.loadClass("com.javaeye.loader.URLClassLoaderTest");
Method m = clas.getMethods()[0];
Object o = clas.newInstance();
m.invoke(o);
}
@Test
public void testInFileSystem() throws Exception{
URL[] urls = new URL[]{new URL("file:/C:/java/")};
URLClassLoader loader = new URLClassLoader(urls);
Class clas = loader.loadClass("com.javaeye.loader.URLClassLoaderTest");
Method m = clas.getMethods()[0];
Object o = clas.newInstance();
m.invoke(o);
}
分别运行两端代码他们输出结果都是:
I am running...
分析:
为什么会出现上述运行结果,很明显是因为com.learn.loader.URLClassLoaderTest对象被加载到内存,此对象中的show方法被执行;
思考:
Java 语言由于在 Java 虚拟机 (JVM) 上运行而显得与众不同,之所以与众不同是因为Java中已编译的程序是一种特殊的、独立于平台的格式,并非依赖于它们所运行的机器。在很大程度上,这种格式不同于传统的可执行程序格式。与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的工具。
2.jvm classLoader architecture
同样给出一个例子代码:
public void testClassLoader2() throws Exception{
URL[] urls = new URL[]{new URL("http://192.168.66.250/root/java/")};
URLClassLoader loader = new URLClassLoader(urls);
System.out.println(loader.getClass());
System.out.println(loader.getParent().getClass());
System.out.println(loader.getParent().getParent().getClass());
System.out.println(loader.getParent().getParent().getParent());
}
运行结果如下:
class java.net.URLClassLoader
class sun.misc.Launcher$AppClassLoader
class sun.misc.Launcher$ExtClassLoader
null
要解释这个运行结果需要说明jvm classloader 结构,如下图:
如图所示,为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构,图中分为四层。和我们上面运行结果是一一对应的
最底层:User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类) ,在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。显然java.net.URLClassLoader属于此层;
AppClassLoader层:System ClassLoader/系统类加载器,主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。java.lang.ClassLoader.getSystemClassLoader()可以得到他,上述sun.misc.Launcher$AppClassLoader属于此层;
ExtClassloader层:Extension ClassLoader/扩展类加载器,主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作,sun.misc.Launcher$ExtClassLoader属于此层;
最顶层:Bootstrap ClassLoader/启动类加载器,主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作,为什么对应这层输出为null?是因为Bootstrap是用C++编写的,我们在Java中看不到它,是null;
- 大小: 4.1 KB
- 大小: 23.7 KB
- 大小: 14.1 KB
分享到:
相关推荐
JVM ClassLoader简析.压缩包中文档和示例代码
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...
1.5 JVM ClassLoader机制 1.6 Java中的synchronized使用 1.7 Java中的反射机制 1.8 Java中Heap与Stack的区别 1.9 Java中String和StringBuffer的区别 1.10 Java中Comparable和Comparator实现对象比较 1.11 Java...
运用代理模式,通过自定义classloader对代码加密,啊;敌法;打飞机
探索JVM底层奥秘ClassLoader源码分析与案例讲解,探索JVM底层奥秘ClassLoader源码分析与案例讲解.
讲解JVM的ClassLoader子系统原理.
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
• JVM指令介绍,获得ClassLoader的途径,CAS指令由硬件提供 • 并发程序设计实现的基础 • 486之后并不需要锁总线 • 基于MESI缓存⼀一致性协议 如果不声明volatile,变量装载到本地变量 中,或者cpu cache中,多...
目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。熟悉和掌握JVM平台有着重要的实用价值和意义。 在本课程中个,将详细介绍JVM的基本原理、...
深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc
Java中ClassLoader的解析,从ClassLoader的角度分析了JVM,装载类,创建类的对象的整个过程,更清晰的了解JVM的运行机制。
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
Understanding the Java ClassLoader
有关JVM的基础教程。介绍JVM原理:hotspot、classfile、classloader、内存模型、锁、同步、JVM内存管理和垃圾收集。
java深度历险 经典研读系列:深入浅出介绍java jvm classpath classloader import
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!