package com.xz.springboottest.day12;
import java.io.IOException;
import java.io.InputStream;
/**
* @description:
* @author: xz
*/
public class ClassLoaderDemo {
public static void main(String[] args) throws Exception {
ClassLoader myClassLoader = new ClassLoader(){
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
//com.xz.springboottest.day12.ClassLoaderDemo
String fileName = name.substring(name.lastIndexOf(".") + 1)+".class";
InputStream is = getClass().getResourceAsStream(fileName);
if(is ==null){//当前包下没有此类
return super.loadClass(name);//调用父类的加载器加载
}
try {
byte[] bytes = new byte[is.available()];
is.read(bytes);
return defineClass(name,bytes,0,bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return loadClass(name, false);
}
};
//实例化
Object obj = myClassLoader.loadClass("com.xz.springboottest.day12.ClassLoaderDemo").newInstance();
System.out.println(obj.getClass());
//判断是否相等
System.out.println(obj instanceof ClassLoaderDemo);
}
}
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 首先,检查请求的类是否已经被加载过了
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
//如果父类加载器抛出ClassNotFoundException
//说明父类加载器无法完成加载请求
}
if (c == null) {
//在父类加载器无法加载的时候
//再调用本身的findClass方法来进行类的加载
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://wwwxz.blog.csdn.net/article/details/123673298
内容来源于网络,如有侵权,请联系作者删除!