JVM(五),ClassLoader
2024-09-17 08:03:02
五、ClassLoader
1.什么是ClassLoader
2.四种ClassLoader
3.自定义CLassLoader
(1)MyClassLoader
public class MyClassLoader extends ClassLoader {
private String path;
private String classLoaderName; public MyClassLoader(String path, String classLoaderName) {
this.path = path;
this.classLoaderName = classLoaderName;
} //用于寻找类文件
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
} //用于加载类文件
private byte[] loadClassData(String name) {
name = path + name + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(new File(name));
out = new ByteArrayOutputStream();
int i = 0;
while ((i = in.read()) != -1) {
out.write(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}
原理还是通过ClassLoader中的deFineClass方法来获取Class类型对象,自定义的是路径
(2)实现ClassLoaderChecker
public class ClassLoaderChecker {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
Class c = m.loadClass("Wali");
c.newInstance();
}
}
(3)实现效果
4.类加载器的双亲委派机制
为什么要使用双亲委派机制来加载class文件-避免多份同样的字节码的加载
5.类的加载方式
隐式加载:new
显示加载:loadClass,formName
(1)类装载过程
(2)代码实例区别
public class LoadDifference {
public static void main(String[] args) throws Exception {
//loadClass加载类,需要调用c.newInstance()才会加载类
ClassLoader cl = Robot.class.getClassLoader();
Class c = cl.loadClass("com.interview.javabasic.reflect.Robot");
c.newInstance();
//forName加载类,在加载类的时候会将Static静态代码块的代码实现出来
Class r = Class.forName("com.interview.javabasic.reflect.Robot");
}
}
使用Class.forName(classname)才能在反射回去类的时候执行static块。(3)数据库链接为什么使用Class.forName(className)
最新文章
- Apache执行Python脚本
- Mono 3.2 上跑NUnit测试
- Scala HandBook
- 【OpenStack】OpenStack系列12之OpenStack自动化测试详解
- jdk1.7的collections.sort(List list)排序问题
- 【转】Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- C++ Primer 随笔 Chapter 4 数组和指针
- Weblogic虚拟目录
- ASP.NETCore的Kestrel服务器
- 【Android】自己动手做个扫雷游戏
- table index &; delete array item
- execution(* com.sample.service.impl..*.*(..))
- MySQL常用内置变量
- 【Python全栈-后端开发】数据库进阶
- 使用JDBC一次执行多条语句(以MySQL为例)
- 一个简单好用的http服务器
- struts2的DevMode(开发模式)模式
- 数据立方体(Cube)
- 【Head First Servlets and JSP】笔记 25:JSTL 参考
- c#枚举的描述和值
热门文章
- PHP数组和对象之间的互换
- java lesson14Homework
- JavaScript例子2-使一个特定的表格隔行变色
- linux mint 安装微信2
- [Android] Installation failed due to: ''pm install-create -r -t -S 4590498' returns error 'UNSUPPORTED''
- 帝国cms 加载更多的实现(父栏目以及子栏目都可以实现)
- 微信小程序页面跳转传参方式
- vue 项目中如何在页面刷新的状态下保留数据
- 第十三章、元类(metaclass)
- 由于MTU设置不当导致的访问超时