package com.zzj.classloader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 双亲委派类加载器,重写findClass(name)方法
*
* @author Administrator
*
*/
public class ParentsDelegateClassLoader extends ClassLoader {
private static final String EXT = ".class";
private String path;
public ParentsDelegateClassLoader() {
path = this.getResource("").getPath();
}
public ParentsDelegateClassLoader(String path) {
this.path = path;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = null;
try {
b = loadClassFile(name);
}
catch (IOException e) {
e.printStackTrace();
}
return this.defineClass(name, b, 0, b.length);
}
private byte[] loadClassFile(String name) throws IOException {
String classFile = getClassFile(name);
System.out.println("即将加载class文件" + classFile);
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream input = new FileInputStream(classFile);
int count;
byte[] temp = new byte[1024];
while ((count = input.read(temp)) > -1) {
out.write(temp, 0, count);
}
out.close();
input.close();
return out.toByteArray();
}
private String getClassFile(String name) {
String pathName = name.replace(".", File.separator);
if (path.endsWith("/") || path.endsWith("\\")) {
return path + pathName + EXT;
}
return path + File.separator + pathName + EXT;
}
}
package com.zzj.classloader;
public class App {
private static final String path = "F:\\ClassloaderTest\\bin";
private static final String classname = "com.zzj.classloader.User";
public static void main(String[] args) throws Exception {
ParentsDelegateClassLoader classLoader = new ParentsDelegateClassLoader(path);
Class<?> clazz = classLoader.loadClass(classname);
System.out.println(clazz);
System.out.println(clazz.getClassLoader());
}
}
class com.zzj.classloader.User sun.misc.Launcher$AppClassLoader@19821f
即将加载class文件F:\ClassloaderTest\bin\com\zzj\classloader\User.class class com.zzj.classloader.User com.zzj.classloader.ParentsDelegateClassLoader@61de33
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// 先判断该类是否已被当前的类加载器加载
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {// 如果存在父类加载器,则委派给父类加载
c = parent.loadClass(name, false);
} else {// 如果父类加载为空,则其父类加载器为引导类加载器
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// 如果父类加载器加载失败,则自己加载,调用的就是findClass方法!
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
package com.zzj.classloader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 非双亲委派类加载器,重写loadClass(name)方法
*
* @author Administrator
*
*/
public class NotParentsDelegateClassLoader extends ClassLoader {
private static final String EXT = ".class";
private String path;
public NotParentsDelegateClassLoader() {
path = this.getResource("").getPath();
}
public NotParentsDelegateClassLoader(String path) {
this.path = path;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
byte[] b = null;
try {
b = loadClassFile(name);
}
catch (FileNotFoundException e) {
System.err.println("加载器" + this.getClass().getName()
+ "没有找到class文件" + name + ",将委派给父类加载器!");
// 委派给父类加载器
return getClass().getClassLoader().loadClass(name);
}
catch (IOException e) {
System.err.println("加载器" + this.getClass().getName() + "加载class文件"
+ name + "失败,将委派给父类加载器!");
// 委派给父类加载器
return getClass().getClassLoader().loadClass(name);
}
// 检查该类是否被当前类加载器加载过(只检查当前类加载器,不会检查父类加载器)
Class<?> clazz = findLoadedClass(name);
if (clazz != null) {
System.out.println("类" + name + "已被加载过!");
return clazz;
} else {
System.out.println("类" + name + "尚未被加载!");
}
return this.defineClass(name, b, 0, b.length);
}
private byte[] loadClassFile(String name) throws IOException,
FileNotFoundException {
String classFile = getClassFile(name);
System.out.println("即将加载class文件" + classFile);
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream input = new FileInputStream(classFile);
int count;
byte[] temp = new byte[1024];
while ((count = input.read(temp)) > -1) {
out.write(temp, 0, count);
}
out.close();
input.close();
return out.toByteArray();
}
private String getClassFile(String name) {
String pathName = name.replace(".", File.separator);
if (path.endsWith("/") || path.endsWith("\\")) {
return path + pathName + EXT;
}
return path + File.separator + pathName + EXT;
}
}
package com.zzj.classloader;
public class App2 {
private static final String className = "com.zzj.classloader.User";
public static void main(String[] args) throws Exception {
NotParentsDelegateClassLoader classLoader = new NotParentsDelegateClassLoader();
Class<?> clazz = classLoader.loadClass(className);
System.out.println(clazz);
System.out.println(clazz.getClassLoader());
}
}
即将加载class文件/E:/Myeclipse/zzjtest/WebRoot/WEB-INF/classes/com\zzj\classloader\User.class 类com.zzj.classloader.User尚未被加载! 即将加载class文件/E:/Myeclipse/zzjtest/WebRoot/WEB-INF/classes/java\lang\Object.class class com.zzj.classloader.User com.zzj.classloader.NotParentsDelegateClassLoader@61de33 加载器com.zzj.classloader.NotParentsDelegateClassLoader没有找到class文件java.lang.Object,将委派给父类加载器!
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有