`

类的加载ClassLoader

    博客分类:
  • Java
阅读更多

类加载器ClassLoader是用来将java的类加载到虚拟机中,类加载器负责读取class字节文件到内存中,并将它转为Class的对象(类对象),通过此实例的 newInstance()方法就可以创建出该类的一个对象。

 

其中重要的方法为findClass(String name)。

 

如何写一个自己的类加载器呢?

首先写一个便于测试的类Student

有一个属性和一个方法

 

package 类的加载;

public class Student {

	int x;

	public void setX(int x) {
		this.x = x;
		System.out.println(x);
	}
}

 

 

 

写一个自己的类加载器。就是读取class文件,并将其实例化为Class对象的一个过程。

但是必须注意,同一个类如果用不同的加载器对其进行多次加载,会产生异常。所以一旦有一个加载器加载过了就不用再进行加载。

 

 

public class MyClassLoder extends ClassLoader {

	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {

		Class c = findLoadedClass(name);
		
		// 保证加载的唯一性,如果之前已经被加载过了,就不用再加载了。
		if (c == null) {
			byte data[] = readFile(name);
			c = this.defineClass(data, 0, data.length);
			this.resolveClass(c);// 将对象c交给虚拟机去管理
			System.out.println("加载好了");
		}
		return c;
	}

	/**
	 * 读取指定的class文件的字节数据
	 * 
	 * @param name
	 * @return
	 */
	public byte[] readFile(String name) {
		byte[] bt = null;
		String path = "bin/" + name.replace(".", "/") + ".class";
		System.out.println(path);
		try {
			FileInputStream fis = new FileInputStream(new File(path));
			// // 但是无法确定你会读到多少数据
			// byte bt[] = new byte[100];
			// fis.read(bt);

			// 用字节数组流临时存储数据,可以不管其长度
			ByteArrayOutputStream baos = new ByteArrayOutputStream();

			int t = fis.read();
			while (t != -1) {
				baos.write(t);
				t = fis.read();
			}
			bt = baos.toByteArray();
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bt;
	}

}

 

 

创建一个加载器

MyClassLoder mcl = new MyClassLoder();

得到这个类

Class c = mcl.findClass("类的加载.Student");

同样,进行方法的测试

Method m = c.getMethod("setX", int.class);

Constructor cs = c.getConstructor();

Object obj = cs.newInstance();

 

m.invoke(obj, 1);

 

输出结果为

bin/类的加载/Student.class

加载好了

1

 

在下面再加一个:

Class c2 = mcl.findClass("类的加载.Student");

Method m2 = c2.getMethod("setX", int.class);

Constructor cs2 = c.getConstructor();

Object obj2 = cs2.newInstance();

 

m2.invoke(obj2, 1);

System.out.println(c==c2);

输出结果为

bin/类的加载/Student.class

加载好了

1

1

 

true

 

可以发现都是同一个类

 

Class c3 = Class.forName("类的加载.Student");
System.out.println(c);
System.out.println(c3);
Constructor cs3 = c3.getConstructor();
Object obj3 = cs3.newInstance();
System.out.println((Student)obj2);

 输出结果为:

class 类的加载.Student

class 类的加载.Student

java.lang.ClassCastException: 类的加载.Student cannot be cast to 类的加载.Student

at 类的加载.Test.main(Test.java:33)

 

也就是说不能重复对其加载。

分享到:
评论

相关推荐

    java自定义类加载classloader文档,包括代码

    上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...

    详解Android类加载ClassLoader

    Android类加载器(ClassLoader)是Android系统中负责查找和加载类的重要组件。在深入理解Android的ClassLoader之前,我们先回顾一下Java的类加载机制。Java的类加载采用的是双亲委派模型,即当一个类加载器需要加载...

    ClassLoader类加载机制和原理详解

    开发者可以通过继承java.lang.ClassLoader类,创建自己的类加载器。这在处理动态加载、插件系统、隔离应用域等场景时非常有用。自定义类加载器需要覆盖`findClass()`方法,实现类的查找和加载逻辑。 4. 双亲委派...

    ClassLoader类加载器

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...

    JAVA ClassLoader 讲解 (类加载器)

    ### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    java应用程序类加载器,ClassLoader for java Application

    1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,由JVM本身实现,主要负责加载JDK核心库,如rt.jar中的类,这些类通常位于JRE的lib目录下。 2. **扩展类加载器(Extension ClassLoader)**:由...

    类加载机制ClassLoader

    在Java编程语言中,类加载机制(ClassLoader)是理解JVM(Java Virtual Machine)工作原理的关键部分。它负责将.class文件从磁盘加载到内存中,使得Java程序能够执行。这个过程包括加载、验证、准备、解析和初始化五...

    java的ClassLoader类加载器机制

    Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    Java类加载器(ClassLoader)1

    Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    使用classloader动态加载Class

    在Java编程语言中,类加载器(ClassLoader)是运行时环境的核心组成部分,它负责将类的字节码从各种来源(如JAR文件、网络、内存等)加载到Java虚拟机(JVM)中,使得程序能够运行。本文将深入探讨“使用classloader...

    Java 类加载机制 ClassLoader Class.forName.pdf

    3. **Application ClassLoader** (应用程序类加载器): 也称为系统类加载器,负责加载用户定义的类路径上的类,通常通过`-classpath`或`-cp`命令行参数指定。 这三种类加载器之间存在层级关系,形成了所谓的“双亲...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    源码中,ClassLoader类维护了一个`parent`属性,用于指向其父类加载器。在创建ClassLoader实例时,如果没有指定父加载器,那么`parent`会被设置为系统类加载器。这是通过调用`getSystemClassLoader()`方法实现的,该...

    java类加载器

    System.out.println("JDK提供的Object类由哪个类加载器加载--&gt; " + classLoader); } ``` 从上述代码中可以看出,系统的类加载器是`AppClassLoader`,它的父加载器是`ExtClassLoader`,而`ExtClassLoader`的父加载...

    类加载器文件

    **类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中,使得这些类可以在Java环境中运行。类加载器不仅能够加载类,还能够根据不同的需求定制加载方式,如从...

    S18-ClassLoader类加载流程1

    - **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(classpath)上的类库。 类加载器之间并非继承关系,而是通过委托关系实现。例如,AppClassLoader会委托...

    ClassLoader(类加载机制)1

    在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(系统类加载器)。Bootstrap ClassLoader负责加载JDK的核心库,Extension ...

Global site tag (gtag.js) - Google Analytics