`
spring5365
  • 浏览: 71523 次
  • 性别: Icon_minigender_1
  • 来自: 钓鱼岛
社区版块
存档分类
最新评论

ClassLoader

 
阅读更多

 

1.类加载器的最终功能是将java字节码转换成JVM中的Class对象。

   实例代码:

class FileSystemClassloader extends ClassLoader {
	private String directory;
	public FileSystemClassloader(String directory) {
		this.directory = directory;
	}
	
	@Override
	public Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] clsBytes = getClassBytes(name);
		if(clsBytes == null)
			throw new ClassNotFoundException();
		return defineClass(name, clsBytes, 0, clsBytes.length);
	}
	
	private byte[] getClassBytes(String name) {
		String location = getClassLoc(name);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(location);
			byte[] buffer = new byte[4096];
			int readLen = 0;
			while ((readLen = fis.read(buffer)) != -1) {
				baos.write(buffer, 0, readLen);
			}
			baos.flush();
			return baos.toByteArray();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			if(fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}

	private String getClassLoc(String name) {
		return this.directory + File.separatorChar + name.replace('.', File.separatorChar) + ".class";
	}
}

//引导类加载器加载路径
System.out.println("sun.boot.class.path:" + System.getProperty("sun.boot.class.path"));
//扩展类加载器加载路径
System.out.println("java.ext.dirs:" + System.getProperty("java.ext.dirs"));
//系统类加载器加载路径
System.out.println("java.class.path:" +System.getProperty("java.class.path"));

2.Java虚拟机中是根据类加载器+类名来区分对象的,所以不同类加载器加载的同一段字节码是两个不同对象,可通过以下代码测试
String className = "com.meteor.classloader.example.Sample";
Class<?> cls1 = fscl1.loadClass(className);
Class<?> cls2 = fscl2.loadClass(className);
System.out.println("cls1 == cls2?" + (cls1 == cls2));
这段代码测试中如果一直打印true,请用上面代码输出加载类的路径,检查类是被哪个加载器加载的。测试过程如用eclipse等工具,还有路径问题,导致类一直由AppClassLoader加载。

3.线程上下文类加载器
  上下文类加载器解决了加载SPI(Service Provider Interface)实现类的方式,父子委托的加载模式并不总适用于Java应用。Java提供了很多SPI接口,如JDBC,JNDI等,这些接口的定义由引导类加载器加载,而实现一般由系统类加载器加载,最终导致类型转换的问题。对于SPI的加载问题,解决办法就是让核心JNDI类使用线程上下文类加载器加载(此处未验证,未看到源代码),打通类加载器的层次结构。

4.Web容器与类加载器
  Web容器一般有自己的加载方式,请参见Tomcat的ClassLoader的实现。
  Tomcat中的WebappClassLoader实现了ClassLoader的loadClass方法,一般自定义Class,建议实现ClassLoader的findClass方法(仅限于一般小的改动,Tomcat的实现比较复杂,对Class的加载有自己的方式)

5.OSGI与类加载器
  学习中。

 

分享到:
评论

相关推荐

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    深入理解ClassLoader工作机制.docx

    《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...

    自定义classloader的使用

    在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...

    classloader

    Java ClassLoader是Java运行时系统的关键但经常被忽视的组件,负责在运行时查找和加载类文件。通过创建自定义ClassLoader,你可以定制JVM,使类文件的引入方式完全重新定义,这提供了很多实用和有趣的可能。这篇教程...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    classloader 加密解密应用程序 ,反编译class

    在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。本文将深入探讨`ClassLoader`的工作原理、加密解密应用程序以及如何防止类被反编译。 首先,让我们理解`ClassLoader`的...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    在Java世界中,类加载器(ClassLoader)是关键的组件之一,它负责将类的字节码文件(.class)从文件系统或网络中加载到Java虚拟机(JVM)中,使得程序能够运行。本篇文章将深入探讨ClassLoader的关系网络以及如何...

    ClassLoader 详解.doc

    《ClassLoader详解》 Java应用程序的运行离不开类的加载,而ClassLoader正是这个过程的关键角色。它负责将类的字节码加载到Java虚拟机(JVM)中并转换为可执行的Java对象。深入理解ClassLoader的工作原理对于优化...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    ClassLoader的 一些测试

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中执行。这篇测试主要探讨了ClassLoader的工作原理及其在实际应用中的使用。通过阅读给出的博文链接,我们可以深入理解...

    java classloader classpath 张孝祥

    ### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...

    classloader体系结构(含hotswap)

    Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

Global site tag (gtag.js) - Google Analytics