我是靠谱客的博主 自觉海燕,最近开发中收集的这篇文章主要介绍JVM:如何实现一个自定义类加载器?1. 为什么要自定义加载器2. 如何实现自定义加载器3. 能不能自己写一个java.lang.String,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JVM:如何实现一个自定义类加载器?

  • 1. 为什么要自定义加载器
  • 2. 如何实现自定义加载器
  • 3. 能不能自己写一个java.lang.String

1. 为什么要自定义加载器

原因:
1、存放在自定义路径上的类,需要通过自定义类加载器去加载。【注意:AppClassLoader加载classpath下的类】
2、类不一定从文件中加载,也可能从网络中的流中加载,这就需要自定义加载器去实现加密解密。

2. 如何实现自定义加载器

实现自定义类加载有以下两步:
1、继承ClassLoader
2、重写findClass,在findClass里获取类的字节码,并调用ClassLoader中的defineClass方法来加载类,获取class对象。
注意:如果要打破双亲委派机制,需要重写loadClass方法。
如下:是一个自定义 的类加载器

public static class MyClassLoader
extends
ClassLoader{
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] data=null;
try {
data= loadByte(name);
} catch (IOException e) {
e.printStackTrace();
}
return this.defineClass(data,0,data.length);
}
private byte[] loadByte(String name) throws IOException {
File file = new File("/Users/admin/test/"+name);
FileInputStream fi = new FileInputStream(file);
int len = fi.available();
byte[] b = new byte[len];
fi.read(b);
return b;
}
}

下面是要加载的类:

public class Demo{
public void say(){
System.out.println("hello");
}
}

该类编译后的class 文件放置在/Users/admin/test/下,然后执行如下代码去加载:


MyClassLoader classLoader = new MyClassLoader();
Class clazz = classLoader.loadClass("Demo.class");
Object o=clazz.newInstance();
Method method = clazz.getMethod("say");
method.invoke(o);

输出:hello

3. 能不能自己写一个java.lang.String

1、代码书写后可以编译不会报错
2、在另一个类中加载java.lang.String,通过反射调用自己写的String类里的方法,得到结果NoSuchMethod,说明加载的还是原来的String,因为通过双亲委派机制,会把java.lang.String一直提交给启动类加载器去加载,通过他加载,加载到的永远是/lib下面的java.lang.String
3、在这个自己写的类中写上main方法
public static void main(String[] args)
执行main方法报错,因为这个String并不是系统的java.lang.String,所以JVM找不到main方法的签名

最后

以上就是自觉海燕为你收集整理的JVM:如何实现一个自定义类加载器?1. 为什么要自定义加载器2. 如何实现自定义加载器3. 能不能自己写一个java.lang.String的全部内容,希望文章能够帮你解决JVM:如何实现一个自定义类加载器?1. 为什么要自定义加载器2. 如何实现自定义加载器3. 能不能自己写一个java.lang.String所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部