实验目的:测试classloader
package frank;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest {
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ClassLoader myClassLoader = new ClassLoader(){
public Class<?> loadClass(String name) throws ClassNotFoundException {
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
InputStream is = this.getClass().getResourceAsStream(fileName);
if(is == null){
return super.loadClass(name);
}else{
byte[] b;
try {
b = new byte[is.available()];
is.read(b);
return this.defineClass(name, b, 0, b.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new ClassNotFoundException(name);
}
}
}
};
//self define loader
Object obj = myClassLoader.loadClass("frank.ClassLoaderTest").newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());
//application loader
System.out.println(frank.ClassLoaderTest.class.getClassLoader());
}
}
实验结果:
frank.ClassLoaderTest@19836ed
frank.ClassLoaderTest$1@15093f1
sun.misc.Launcher$AppClassLoader@39ab89
实验总结, java1.2之前可以覆盖loadClass方法, java 1.2 之后建议实现覆盖findClass 方法。
例子请看下面
package frank;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoader3 extends ClassLoader{
public Class<?> findClass(String name){
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
InputStream is = this.getClass().getResourceAsStream(fileName);
if(is == null){
try {
return super.loadClass(name);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
byte[] b;
try {
b = new byte[is.available()];
is.read(b);
return this.defineClass(name, b, 0, b.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
throw new ClassNotFoundException(name);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
return null;
}
}
package frank;
public class ClassLoaderTest2{
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ClassLoader3 loader3 = new ClassLoader3();
Object obj = loader3.findClass("frank.ClassLoaderTest2").newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());
System.out.println(frank.ClassLoaderTest2.class.getClassLoader());
}
}
输出:
frank.ClassLoaderTest2@3e0ebb
frank.ClassLoader3@e6f7d2
sun.misc.Launcher$AppClassLoader@39ab89
相关推荐
开源项目"classloader-playground"为我们提供了一个学习和实验Java类加载器的绝佳平台。 首先,我们来理解一下什么是类加载器。在Java中,类加载的过程包括加载、验证、准备、解析和初始化五个阶段。类加载器主要...
本文将深入探讨"Maven-classloader-plugin",一个专为解决Maven插件中的类加载问题而设计的实验性插件。 首先,我们需要明白Maven插件的工作原理。Maven插件是基于Java的,它们在构建生命周期的不同阶段执行特定的...
首先,Java的ClassLoader主要分为四种类型: 1. 启动类加载器(Bootstrap ClassLoader):它是JVM的一部分,由C++实现,负责加载JDK的根目录(rt.jar)中的核心类库,如java.lang.String等。 2. 扩展类加载器...
解释:J2EE应用中的类加载器层次结构是Bootstrap ClassLoader -> Extension ClassLoader -> System ClassLoader -> Custom ClassLoader。 11. 垃圾回收(GC)是指什么? 答案:GC是Java中的垃圾回收机制,它可以...
在Java编程中,理解和掌握一些核心概念和技术是非常重要的。这里我们将深入探讨Java的动态加载机制、类加载器的工作原理以及JDK和JRE的...不断探索和实验,将有助于你在Java编程领域积累丰富的经验,避免不必要的弯路。
### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: ...需要注意的是,JVM的学习是需要与实践相结合的,只有通过不断的实验和调优,才能更好地掌握和应用这些知识。
类加载器(ClassLoader)负责加载类文件,分为启动类加载器、扩展类加载器和应用类加载器。通过自定义类加载器进行实验,可以深入理解类加载过程,甚至实现双亲委派模型的定制。 垃圾回收(Garbage Collection,GC...
5. **资源管理**:`Image`类被用来存储所有需要的图像资源,使用`ClassLoader.getSystemResource`方法加载图片,这是一种标准的Java类路径资源加载方式。 6. **对象建模与UML类图**:在项目分析阶段,需要确定游戏...
主要有三个类加载器:Bootstrap ClassLoader、Common ClassLoader和Webapp ClassLoader。Bootstrap加载JDK的类,Common加载`common.loader`指定的类,而Webapp类加载器则负责加载每个Web应用自己的类。理解类加载...
类加载器主要由Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader三部分组成,它们按照双亲委托模型进行工作。这个代码仓库可能包含了不同类加载器的示例,演示如何自定义类加载器以及如何影响类的...
该模块主要用于Class和Classloader如何获取资源。 stream 用于JDK8的stream api用法。 string 用于写String类的用法。 iText-demo 主要来自 Jackson 使用Jackson和JDK序列化机制。 formatter JDK自带格式化类。 End
ClassLoader 会去硬盘上搜索.class 文件,找到该文件则将该字节码文件装载到 JVM 中。然后,JVM 将字节码文件解释成二进制数据,并与操作系统和底层硬件平台进行交互。 Java 编程语言的基本原理是确保 Java 程序...
1. **类加载器(ClassLoader)**:负责读取Java类文件(.class),将它们转换为可执行的字节码。 2. **内存空间(Memory Space)**: - **方法区(Method Area)**:存储每个类的信息、静态变量等。 - **Java栈(Java Stack...
在这个名为"jvm_code-master"的压缩包中,可能包含了书中涉及的各种示例代码、实验项目或作者提供的补充材料,旨在为学习者提供一个实践和加深理解的平台。 JVM是Java语言的核心组成部分,它是Java程序运行的基石。...
在classloaderDemo.jar中,我们可以推测这可能是一个演示或实验类加载器功能的项目。 类加载器在Java虚拟机(JVM)中起着至关重要的作用。它分为三个层次:Bootstrap ClassLoader、Extension ClassLoader和...
1. 类加载机制:JVM如何加载类文件,以及类加载器(Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader)的作用。理解双亲委派模型,了解自定义类加载器的实现。 2. 内存模型:JVM内存分为堆内存、栈...
Java沙箱,正如标题“java-sandbox”所示,是一个安全的环境,用于实验和测试Core Java的相关特性。在计算机安全领域,沙箱是一种技术,它允许程序运行在受限制的环境中,防止它们对系统造成潜在的危害。对于Java,...
描述中的"JNIDome"可能是“JNIDemo”的笔误,暗示这可能是一个用于教学或实验目的的JNI示例。这个项目可能包含了编写、编译和运行JNI程序所需的所有文件。 标签"代码,Demo"进一步确认了这是一个代码示例,旨在展示...