`

深入理解classloader

    博客分类:
  • JVM
 
阅读更多
一、获取Class的方法

1.直接用(类名.class)
2.对象.getClass()
3.Class.forName("类的全限定名")
     Class c = String[].class;
		System.out.println("c===>"+c);
		  
		c = new String[1].getClass();   
		System.out.println("c===>"+c);
	//JVM对Array的实际类名编码为: 左括号 + 类别代码 + 类名 

		try {
			c = Class.forName("[Ljava.lang.String;");
	
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 


输出结果为:
c===>class [Ljava.lang.String;
c===>class [Ljava.lang.String;
c===>class [Ljava.lang.String;


我们看下其他的数组类名:
System.out.println("byte[]: " + byte[].class.getName());   
		System.out.println("char[]: " + char[].class.getName());   
		System.out.println("int[]: " + int[].class.getName());   
		System.out.println("long[]: " + long[].class.getName());   
		System.out.println("double[]: " + double[].class.getName());   
		System.out.println("float[]: " + float[].class.getName());  


运行结果如下为:
byte[]: [B
char[]: [C
int[]: [I
long[]: [J
double[]: [D
float[]: [F


系统默认的classloader如何获取?
   ClassLoader.getSystemClassLoader()

从运行结果可以看到系统默认使用sun.misc.Launcher$AppClassLoader这个ClassLoader。

classloader加载类的方法:ClassLoader.loadClass(String className) 

如下例子:


public class User {

	private String name;
	private Integer age;
	
	public User(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public User() {
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	
	public void sayHello()
	{
		System.out.println("Hello,I am "+name+","+age+" years old.");
	}
	
	
}

 



//测试类中的方法
private static void test2()
	{
	   ClassLoader cl=	ClassLoader.getSystemClassLoader();  
	   System.out.println("cl===> " + cl);
	   try {
		Class clazz = cl.loadClass("com.test.jvm.classloader.User");
	    User user =(User)clazz.newInstance();
		user.sayHello();
		
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		System.out.println("class com.test.jvm.classloader.User not found!");
	} catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  



运行结果发现 已经调用sayHello方法了

二、自定义classloader

classloader加载顺序:
⑴首先执行一次检查,查看客户程序请求的类是否已经由当前的类装入器装入。如果是,则返回已装入的类,请求处理完毕。JVM缓冲了类装入器装入的所有类,已经装入的类不会被再次装入。

 ⑵如果尚未装入类,则装入类的请求被委托给父类装入器,这个操作发生在当前的类装入器尝试装入指定的类之前。委托装入类的操作一直向上传递,直至bootstrap类装入器,如前所述,bootstrap类装入器是处于树形结构的顶层,它不再有可委托的父类装入器。

 ⑶如果父类装入器未能装入指定的类,则当前的类装入器将尝试搜索该类。每一个类装入器有预定义的搜索和装入类的位置。例如,bootstrap类装入器搜索 sun.boot.class.path系统属性中指定的位置(包括目录和zip、jar文件),system类装入器搜索的位置由JVM开始运行时传入的CLASSPATH命令行变量指定(相当于设置java.class.path系统属性)。如果找到了类,则类装入器将类返回给系统,请求处理完毕。


三、classloader的命名空间

*在JVM当中,ClassLoader会被当成命名空间来分隔各自加载的类*

# 项目中可以使用不同的ClassLoader来加载包名、类名完全相同的Class,但是这两个Class的内容可以完全不一样。

# 即使是同一个Class文件,如果被两个不同的ClassLoader来加载,那么在JVM中它们相互独立,不算是同一个Class。

第一种情况我们可能会经常遇到,比如使用开源框架时,有的框架里面可以看到对同一个项目有多个不同版本的依赖,有的地方使用版本x,有的地方使用版本y,x与y的包名,类名都一样,但里面的内容可以已经不同,却可以相安无事,这就是由于它们运行在各自独立的ClassLoader当中









分享到:
评论

相关推荐

    深入理解ClassLoader工作机制.docx

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

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得...深入理解ClassLoader的工作原理,不仅有助于提升编程能力,还能帮助开发者在面对复杂系统设计时做出更明智的决策。

    ClassLoader的 一些测试

    通过阅读给出的博文链接,我们可以深入理解ClassLoader的功能、分类以及如何进行自定义。 首先,ClassLoader的基本职责是加载.class文件,将字节码转化为运行时的Java对象。这个过程分为三个步骤:加载、验证和初始...

    ClassLoader 详解.doc

    深入理解ClassLoader的工作原理对于优化应用性能、解决类加载问题以及实现自定义加载策略至关重要。 首先,JVM启动时,会构建一个类加载器的层次结构,主要包括三个基本类加载器: 1. Bootstrap ClassLoader:引导...

    ClassLoader 深入解析

    深入理解ClassLoader的工作原理和机制,对于优化应用程序性能、解决类加载问题以及理解Java的运行时环境具有重要意义。 ClassLoader的层次结构通常由Bootstrap ClassLoader、Extension ClassLoader和Application ...

    Tomcat 5.0.18 ClassLoader source code insight

    深入理解ClassLoader的源码,不仅可以帮助我们更好地优化应用性能,也能让我们在处理类加载问题时游刃有余。下面,我们将详细探讨Tomcat 5.0.18版本中的ClassLoader工作原理。 首先,ClassLoaders在Java中起着至关...

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    总的来说,深入理解ClassLoader对于优化Java应用性能、解决类加载问题以及实现特定功能(如插件化、动态部署)具有重要意义。通过源码分析和实际案例,我们可以更深入地掌握JVM的工作原理,提升我们的Java开发技能。

    Java SE: ClassLoader in depth

    深入理解ClassLoader是深入理解Java动态加载机制、自定义类加载器以及对类的热部署等高级特性的重要基础。 在Java中,ClassLoader遵循的是委托模型(Delegation Model)。当一个类加载器接收到一个类加载请求时,它...

    浅析ClassLoader

    《深入理解ClassLoader》 在Java世界中,ClassLoader是运行时加载类的核心机制,它负责将类的.class文件加载到JVM中,使得程序能够运行。本文将深入剖析ClassLoader的工作原理,以及其在实际开发中的应用。 一、...

    java classLoader 的全面讲解

    深入理解ClassLoader对于优化应用性能、处理类加载问题以及实现自定义加载策略至关重要。 一、ClassLoader 基本概念 1. 类加载器的层次结构:在Java中,类加载器形成了一个树形结构,通常由Bootstrap ClassLoader...

    走出ClassLoader误区

    无论是系统开发人员还是应用开发人员,都需要深入理解ClassLoader的工作原理,避免陷入误区,确保代码的稳定性和可扩展性。在实际开发中,应根据具体的应用场景和需求,合理选择和使用不同的类加载策略,以达到最佳...

    深入了解JavaClassLoader,Bytecde.pdf

    深入理解ClassLoader对于优化应用程序、实现动态加载和插件系统等高级功能至关重要。 1. **什么是ClassLoader** 在Java中,每个类都由一个`.class`文件表示,这些文件在运行时并不一次性全部加载到内存中,而是按...

    classloader

    首先,让我们深入了解ClassLoader的基本概念。在传统编程语言中,如C或C++,程序通常是一个单一的可执行文件,而Java则不同,它的编译结果是以平台无关的类文件格式存在。每个类文件对应于一个单独的Java类,且这些...

    Java ClassLoader定制实例

    理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将深入探讨Java ClassLoader的内部工作,并通过一个具体的实例来展示如何定制自己的ClassLoader。 ...

    JVM ClassLoader简析

    通过分析这些示例,我们可以更好地理解ClassLoader的工作机制。 总的来说,理解和掌握JVM ClassLoader对于优化Java应用性能、实现动态加载和插件系统至关重要。深入学习ClassLoader不仅有助于提升编程技巧,也有助...

    深入Java虚拟机_ClassLoader

    《深入Java虚拟机_ClassLoader》是一本专注于Java虚拟机(JVM)中ClassLoader部分的专著,旨在帮助读者深入理解Java程序如何加载、链接和初始化类。ClassLoader是Java平台核心特性的一部分,它负责查找和加载类到JVM...

    Java加载。jar包

    #### 二、深入理解ClassLoader `java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求时提供服务。具体而言,当 JVM 需要使用一个类时,它会向 `ClassLoader` 请求该类,随后 ...

Global site tag (gtag.js) - Google Analytics