类加载器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)
也就是说不能重复对其加载。
相关推荐
上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...
Android类加载器(ClassLoader)是Android系统中负责查找和加载类的重要组件。在深入理解Android的ClassLoader之前,我们先回顾一下Java的类加载机制。Java的类加载采用的是双亲委派模型,即当一个类加载器需要加载...
开发者可以通过继承java.lang.ClassLoader类,创建自己的类加载器。这在处理动态加载、插件系统、隔离应用域等场景时非常有用。自定义类加载器需要覆盖`findClass()`方法,实现类的查找和加载逻辑。 4. 双亲委派...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...
1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,由JVM本身实现,主要负责加载JDK核心库,如rt.jar中的类,这些类通常位于JRE的lib目录下。 2. **扩展类加载器(Extension ClassLoader)**:由...
在Java编程语言中,类加载机制(ClassLoader)是理解JVM(Java Virtual Machine)工作原理的关键部分。它负责将.class文件从磁盘加载到内存中,使得Java程序能够执行。这个过程包括加载、验证、准备、解析和初始化五...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
在Java编程语言中,类加载器(ClassLoader)是运行时环境的核心组成部分,它负责将类的字节码从各种来源(如JAR文件、网络、内存等)加载到Java虚拟机(JVM)中,使得程序能够运行。本文将深入探讨“使用classloader...
3. **Application ClassLoader** (应用程序类加载器): 也称为系统类加载器,负责加载用户定义的类路径上的类,通常通过`-classpath`或`-cp`命令行参数指定。 这三种类加载器之间存在层级关系,形成了所谓的“双亲...
源码中,ClassLoader类维护了一个`parent`属性,用于指向其父类加载器。在创建ClassLoader实例时,如果没有指定父加载器,那么`parent`会被设置为系统类加载器。这是通过调用`getSystemClassLoader()`方法实现的,该...
System.out.println("JDK提供的Object类由哪个类加载器加载--> " + classLoader); } ``` 从上述代码中可以看出,系统的类加载器是`AppClassLoader`,它的父加载器是`ExtClassLoader`,而`ExtClassLoader`的父加载...
**类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中,使得这些类可以在Java环境中运行。类加载器不仅能够加载类,还能够根据不同的需求定制加载方式,如从...
- **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(classpath)上的类库。 类加载器之间并非继承关系,而是通过委托关系实现。例如,AppClassLoader会委托...
在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(系统类加载器)。Bootstrap ClassLoader负责加载JDK的核心库,Extension ...