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);
-
}
分别运行两端代码他们输出结果都是:
分析:
为什么会出现上述运行结果,很明显是因为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;
原文出自:http://www.iteye.com/topic/753834
分享到:
相关推荐
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...
### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责在运行时查找并加载类到JVM中。这个教程将深入探讨ClassLoader的工作原理、类型以及如何自定义类加载器。 一、Java ClassLoader 基础 1. 类...
Java ClassLoader学习总结 Java 类加载机制是 Java 中一个非常重要的机制,它负责加载 Class 文件到 JVM,以供程序使用。ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。...
### Java ClassLoader详解:以淘宝网为例 #### 一、ClassLoader概述 在Java环境中,类加载器(ClassLoader)是负责加载Java类到JVM的重要组件。它不仅实现了类的加载机制,还支持了动态加载与卸载的功能。本文将...
### Java ClassLoader理解详解 #### 一、引言 在商业流行的编程语言中,Java以其独特的运行机制脱颖而出:它在Java虚拟机(JVM)上运行。这意味着编译后的程序采用一种特殊的、与平台无关的格式,而不是针对特定...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)中的一个重要组成部分,它负责加载类的字节码文件,使得程序能够运行。深入理解ClassLoader对于优化应用性能、处理类加载问题以及实现自定义加载策略至关重要。 一...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
破解java加密的ClassLoader.java,在classloader植入破解代码
Java ClassLoader是Java虚拟机(JVM)的重要组成部分,它负责加载类到JVM中运行。理解ClassLoader的工作原理对于深入学习Java以及进行JVM优化、插件开发等高级技术至关重要。下面将详细介绍Java ClassLoader的基本...
在深入探讨Java类加载器(ClassLoader)之前,我们首先需要了解它在Java运行时系统中的核心作用。类加载器是Java虚拟机(JVM)的一个关键组成部分,负责查找、加载和链接类文件到JVM中。它的存在使得Java应用程序...
Java ClassLoader 是一个重要的、但又常常被人忽略的 Java 运行时系统组件。它是负责在运行时查找和装入类文件的类。创建自己的 ClassLoader 可以以实用且有趣的方式定制 JVM,这样可以让您彻底重新定义如何将类文件...