今天被问及classloader,之前对于这个确实不够了解,貌似写as代码用这个倒是很多,tomcat的时候见过,仅此而已。晚上回来看了下,有了基本的了解。
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
Class a = Class.forName("test1.test2");
a = test2.class;
a.newInstance();
test2 b = new test2();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
a = cl.loadClass("test1.test2");
}
}
class test2 {
static {
System.out.println("111");
}
public test2() {
System.out.println("222");
}
}
简单代码吧,输出为111,222,222
注意的是无论test2.class还是classloader都只是加载class,而不会初始化,也不会调用静态方法。而class.forname这个会调用静态方法。
关于classloader,最基本的了解这是lang下面的一个抽象类,具体实现的有urlclassloader。如果自己实现一个classloader,最重要的实现findClass方法。
一个非常简单的例子。
public class LoaderStudy extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
byte[] bytes = loadClassData(name);
Class theClass = defineClass(name, bytes, 0, bytes.length);// A
if (theClass == null)
throw new ClassFormatError();
return theClass;
}
private byte[] loadClassData(String name) {
// load the class data from the connection
try {
String classFile = name;
FileInputStream fis = new FileInputStream(classFile);
FileChannel fileC = fis.getChannel();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableByteChannel outC = Channels.newChannel(baos);
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
int i = fileC.read(buffer);
if (i == 0 || i == -1) {
break;
}
buffer.flip();
outC.write(buffer);
buffer.clear();
}
fis.close();
return baos.toByteArray();
} catch (IOException fnfe) {
try {
throw new ClassNotFoundException(name);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
}
当然,这些classloader都属于User Custom ClassLoader
查阅这篇文章http://www.iteye.com/topic/136427
引用
jvm classLoader architecture :
a, Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.
b, Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作
c, System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.
b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.
加载顺序为从下向上询问是否加载,然后从上向下加载。
classloader最大的用处肯定是动态加载,类似于play!这样的不需要重启动的热加载可以用classloader来实现。
分享到:
相关推荐
网工复习笔记2.rar 网工复习笔记2.rar
计算机组成原理复习笔记2.pdf 本资源摘要信息涵盖计算机组成原理的基础知识点,包括计算机系统的基本组成、CPU、存储器、输入/输出接口、总线、软件、硬件等概念的解释和定义。同时,也涉及到计算机系统的基本组成...
期末前端HTML网页复习笔记2,是喵子画网页的知识点集中整理,配套的。细节关注我的专栏,有知识,有配套练习题。
网络工程师复习笔记 网络工程师复习笔记 网络工程师复习笔记
网络工程师笔记,希望对你的网工考试有所帮助!
教育资料
网络工程师笔记串讲主要知识点 可以帮你节省时间学好网络方面的知识
2018年信息系统项目管理师复习精华笔记.doc2018年信息系统项目管理师复习精华笔记.doc2018年信息系统项目管理师复习精华笔记.doc2018年信息系统项目管理师复习精华笔记.doc2018年信息系统项目管理师复习精华笔记.doc...
Java基础每日复习笔记-JavaSE高级阶段.edf
Java EE的复习笔记是学习这个复杂框架的重要参考资料,尤其对于开发者来说,深入理解其核心概念和技术是必不可少的。 首先,Struts是Java EE中的一个MVC(Model-View-Controller)框架,它的主要任务是分离业务逻辑...
软考中级 - 软件设计师 - 专题复习笔记3软考中级 - 软件设计师 - 专题复习笔记3软考中级 - 软件设计师 - 专题复习笔记3软考中级 - 软件设计师 - 专题复习笔记3软考中级 - 软件设计师 - 专题复习笔记3软考中级 - 软件...
《软件工程复习笔记考研复习概览》 软件工程是一门涉及使用科学知识和技术原理来定义、开发和维护软件的学科。随着计算机技术的发展,软件工程的重要性日益凸显,尤其是在应对日益复杂的软件开发挑战时。本复习笔记...
西安交通大学软件学院操作系统复习笔记,包含前九个章节的内容,可以查看博文https://blog.csdn.net/qq_46311811/article/details/122322967 查看内容及介绍
Java基础每日复习笔记-JavaSE高级阶段.2020-10-13-211312.edf
《华工随机信号课程考试复习笔记》是针对华南理工大学随机信号课程的一份重要参考资料,旨在帮助学生系统地理解和掌握随机过程的基本概念、理论及其在工程中的应用。这份笔记结合了2022年1月6日的最新教学内容,旨在...
【JAVA Web复习笔记】 在JAVA Web开发中,我们首先要理解几个关键的概念。Web技术主要分为两种架构模式:C/S(客户端/服务器端)和B/S(浏览器/服务器)。C/S架构通常涉及到专用的客户端应用程序与服务器进行交互,...
信息系统管理工程师复习笔记涵盖了诸多专业知识点,是软考信息系统管理工程师考试的复习资料。以下知识点的详细解读: 1. CPU架构与组成:内容中涉及了CPU的基本组成,如控制单元(CU),算术逻辑单元(ALU),以及缓存...
这份笔记包含概率论与数理统计(A)课程全部知识,每次写作业前我都会翻阅这本笔记,考试前半个月认真复习笔记。最后,因为我有了这份笔记,在概率论与数理统计(A)期末考试中我荣获89分。虽然是一门考察课,但是我...
《网络管理员复习笔记1到15》是一份全面梳理网络工程基础知识的资料,对于网络工程师来说,这是一份不可多得的复习材料,尤其对于准备网络工程师考试的人员而言,具有较高的参考价值。 网络工程领域博大精深,涉及...