java学习之深入类加载器–ClassLoader
java学习之深入类加载器–ClassLoader
例子:
public class Demo01 {
public static void main(String[] args) {
System.out.println(ClassLoader.getSystemClassLoader());
System.out.println(ClassLoader.getSystemClassLoader().getParent());
System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
System.out.println(System.getProperty("java.class.path"));
}
}
四、类加载的代理模式以及顺序1.代理模式交给其他加载器来加载指定的类
2.双亲委托机制双亲委托机制是代理模式的一种
五、自定义类加载器:1.自定义类加载器的流程:继承:java.lang.首先检查请求的类型是否已经被这个类加载器加载到命名空间了。如果已经加载,直接返回。委派类加载请求给父类加载器,如果父类加载器能够完成java 类加载器,则返回父类加载器加载的Class实例。调用本类加载器的(…)方法,试图获取对应的字节码java学习之深入类加载器–ClassLoader,如果获取到,则调用(…)导入类型到方法区;如果获取不到对应的字节码或者其他原因失败,返回异常给(…),转抛异常,终止加载过程。注意:被两个类加载器加载的同一个类,JVM不认为是相同的类。
文件类加载器
网络类加载器

加密解密类加载器(取反操作,DES对称加密解密)
例:
文件类加载器:
public class FileSystemClassLoader extends ClassLoader {
// com.test.TestClassLoader.Test -->
// E:workspaceimagescomtestTestClassLoaderTest.class
private String rootDir;
public FileSystemClassLoader(String rootDir) {
this.rootDir = rootDir;
}
@Override
public Class findClass(String name) throws ClassNotFoundException {
//先查询有没有加载过这个类,如果已经加载,直接返回。如果没有加载则按照加载顺序加载
Class cc = findLoadedClass(name);
if (cc != null) {
return cc;
} else {
try {
ClassLoader parent = this.getParent();
cc = parent.loadClass(name);// 委派给父类加载
} catch (Exception ee) {
}
if (cc != null) {
return cc;
} else {
byte[] byteclass = getByteClass(name);
if (byteclass == null) {
throw new ClassNotFoundException();
} else {
cc = defineClass(name, byteclass, 0, byteclass.length);//自己加载
}
}
}
return cc;
}
//获取字节码文件的字节
private byte[] getByteClass(String classname) {
String path = rootDir +"/"+ classname.replace(".", "/") + ".Class";
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
is = new FileInputStream(path);
baos = new ByteArrayOutputStream();
byte[] arr = new byte[1024];
int len = 0;
while (-1 != (len = is.read(arr))) {
baos.write(arr, 0, len);
}
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
应用:
public class TestFileClassLoader {
public static void main(String[] args) throws ClassNotFoundException {
String dir = "E:/workspace/images";
String classname = "com.test.TestClassLoader.Test";
FileSystemClassLoader file = new FileSystemClassLoader(dir);
FileSystemClassLoader file2 = new FileSystemClassLoader(dir);
Class c1 = file.findClass(classname);
Class c2 = file.findClass(classname);
Class c3 = file2.findClass(classname);
Class c4 = file.findClass("java.lang.String");
Class c5 = file.findClass("bean.User");
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());//同一个类被不同的加载器加载,JVM也认为是不同的类
System.out.println(c4.getClassLoader());//引导类加载器
System.out.println(c1.getClassLoader());//自定义类加载器
System.out.println(c5.getClassLoader());//默认加载器
}
}
六、线程上下文类加载器1.双亲委托机制以及类加载器的问题通常当你需要动态加载资源的时候,你至少有三个可以选择:

2.线程类加载器是为了抛弃双亲委派加载链模式。每个线程都有一个关联的上下文类加载器,如果你使用new ()方式生成新的线程,新线程将继承其父线程的上下文类加载器java 类加载器,如果程序对线程上下文类加载器没有任何改动的话java学习之深入类加载器–ClassLoader,程序中所有的线程将都使用系统类加载器作为上下文类加载器。
七、服务器的类加载机制一切都是为了安全
1.不能使用系统默认的类加载器2.为了安全需要实现自己的类加载器。我可以限制你只能把类写在指定的地方,否则我不给你加载!
八、OSGN原理介绍OSGI(Open )是面向Java的动态模块系统。它为开发人员提供了面向服务和基于组件的运行环境java 类加载器,并提供标准的方式用来管理软件的生命周期。
OSGI已经被实现和部署在很多产品上,在开源社区也得到了广泛的支持。就是基于OSGI技术来构建的。
原理:
OSGI中的每个模块()都包含java包和类,模块可以声明它所依赖的需要导入()的其他模块的java包和类(-),也可以声明导出()自己的包和类,供其他模块使用(通过-),也就是说需要能够隐藏和共享一个模块中的某些java包和类。这就是通过OSGI特有的类加载器机制来实现的,OSGI中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的java包和类。当它需要加载JAVA核心库类时(以java开头的包和类),它会代理给父类加载器(通常是启动类加载器)来完成。当它需要加载所导入的java类时,它会代理给导出此java类的模块来完成加载,模块也可以显示的生命某些java包和类,必须由父类加载器来加载。只需要设置系统属性, org.osgi..的值即可
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » java学习之深入类加载器–ClassLoader
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

