`

实验四: classloader

 
阅读更多

实验目的:测试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依赖隔离容器类.zip

    开源项目"classloader-playground"为我们提供了一个学习和实验Java类加载器的绝佳平台。 首先,我们来理解一下什么是类加载器。在Java中,类加载的过程包括加载、验证、准备、解析和初始化五个阶段。类加载器主要...

    maven-classloader-plugin:只是针对Maven插件中的类加载问题的实验

    本文将深入探讨"Maven-classloader-plugin",一个专为解决Maven插件中的类加载问题而设计的实验性插件。 首先,我们需要明白Maven插件的工作原理。Maven插件是基于Java的,它们在构建生命周期的不同阶段执行特定的...

    java 类加载器 class loader

    首先,Java的ClassLoader主要分为四种类型: 1. 启动类加载器(Bootstrap ClassLoader):它是JVM的一部分,由C++实现,负责加载JDK的根目录(rt.jar)中的核心类库,如java.lang.String等。 2. 扩展类加载器...

    java面试题.docx

    解释:J2EE应用中的类加载器层次结构是Bootstrap ClassLoader -&gt; Extension ClassLoader -&gt; System ClassLoader -&gt; Custom ClassLoader。 11. 垃圾回收(GC)是指什么? 答案:GC是Java中的垃圾回收机制,它可以...

    java编程经验汇总

    在Java编程中,理解和掌握一些核心概念和技术是非常重要的。这里我们将深入探讨Java的动态加载机制、类加载器的工作原理以及JDK和JRE的...不断探索和实验,将有助于你在Java编程领域积累丰富的经验,避免不必要的弯路。

    JVM必知必会

    ### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: ...需要注意的是,JVM的学习是需要与实践相结合的,只有通过不断的实验和调优,才能更好地掌握和应用这些知识。

    javalab:JVM上的各种实验

    类加载器(ClassLoader)负责加载类文件,分为启动类加载器、扩展类加载器和应用类加载器。通过自定义类加载器进行实验,可以深入理解类加载过程,甚至实现双亲委派模型的定制。 垃圾回收(Garbage Collection,GC...

    Java实现的捉螃蟹游戏.doc

    5. **资源管理**:`Image`类被用来存储所有需要的图像资源,使用`ClassLoader.getSystemResource`方法加载图片,这是一种标准的Java类路径资源加载方式。 6. **对象建模与UML类图**:在项目分析阶段,需要确定游戏...

    tomcat 学习与分析总结资料

    主要有三个类加载器:Bootstrap ClassLoader、Common ClassLoader和Webapp ClassLoader。Bootstrap加载JDK的类,Common加载`common.loader`指定的类,而Webapp类加载器则负责加载每个Web应用自己的类。理解类加载...

    jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice.zip

    类加载器主要由Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader三部分组成,它们按照双亲委托模型进行工作。这个代码仓库可能包含了不同类加载器的示例,演示如何自定义类加载器以及如何影响类的...

    java8源码-javase:Java

    该模块主要用于Class和Classloader如何获取资源。 stream 用于JDK8的stream api用法。 string 用于写String类的用法。 iText-demo 主要来自 Jackson 使用Jackson和JDK序列化机制。 formatter JDK自带格式化类。 End

    Java编程语言的基本原理.docx

    ClassLoader 会去硬盘上搜索.class 文件,找到该文件则将该字节码文件装载到 JVM 中。然后,JVM 将字节码文件解释成二进制数据,并与操作系统和底层硬件平台进行交互。 Java 编程语言的基本原理是确保 Java 程序...

    JavaVM运作原理

    1. **类加载器(ClassLoader)**:负责读取Java类文件(.class),将它们转换为可执行的字节码。 2. **内存空间(Memory Space)**: - **方法区(Method Area)**:存储每个类的信息、静态变量等。 - **Java栈(Java Stack...

    jvm_code-master.rar

    在这个名为"jvm_code-master"的压缩包中,可能包含了书中涉及的各种示例代码、实验项目或作者提供的补充材料,旨在为学习者提供一个实践和加深理解的平台。 JVM是Java语言的核心组成部分,它是Java程序运行的基石。...

    coreJava-开源

    在classloaderDemo.jar中,我们可以推测这可能是一个演示或实验类加载器功能的项目。 类加载器在Java虚拟机(JVM)中起着至关重要的作用。它分为三个层次:Bootstrap ClassLoader、Extension ClassLoader和...

    get-jvm:研究JVM并测试其机制

    1. 类加载机制:JVM如何加载类文件,以及类加载器(Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader)的作用。理解双亲委派模型,了解自定义类加载器的实现。 2. 内存模型:JVM内存分为堆内存、栈...

    java-sandbox:这是一个Java沙箱,主要用于试验与CoreJava相关的构造

    Java沙箱,正如标题“java-sandbox”所示,是一个安全的环境,用于实验和测试Core Java的相关特性。在计算机安全领域,沙箱是一种技术,它允许程序运行在受限制的环境中,防止它们对系统造成潜在的危害。对于Java,...

    JNIDemo.zip

    描述中的"JNIDome"可能是“JNIDemo”的笔误,暗示这可能是一个用于教学或实验目的的JNI示例。这个项目可能包含了编写、编译和运行JNI程序所需的所有文件。 标签"代码,Demo"进一步确认了这是一个代码示例,旨在展示...

Global site tag (gtag.js) - Google Analytics