zl程序教程

您现在的位置是:首页 >  其它

当前栏目

自定义类加载器

自定义 加载
2023-09-11 14:16:04 时间
public static void main(String[] args) throws Exception{ ClassLoaderTest01 loader1 = new ClassLoaderTest01("loader1"); loader1.setPath("D:\\log4j\\sys\\"); ClassLoaderTest01 loader2 = new ClassLoaderTest01("loader2",loader1); loader2.setPath("D:\\log4j\\common\\"); ClassLoaderTest01 loader3 = new ClassLoaderTest01("loader3",null); loader3.setPath("D:\\log4j\\common\\"); try{ test(loader2,"com.zkn.newlearn.classloader.Parent"); }catch(Exception e){ loader2 = new ClassLoaderTest01("loader02"); loader2.setPath("D:\\log4j\\common\\"); test(loader2,"com.zkn.newlearn.classloader.Parent"); test(loader3,"com.zkn.newlearn.classloader.Parent"); private static void test(ClassLoader loader,String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class clazz = null; try{ clazz = loader.loadClass(name); }catch(Exception e){ e.printStackTrace(); clazz.newInstance();
 
package com.zkn.newlearn.classloader;

 * @author zkn

public class Parent {

 public static int i = 1;

 public Parent(){

 new Dog();

 System.out.println("Parent类加载器为:"+Parent.class.getClassLoader());

 
package com.zkn.newlearn.classloader;

 * @author pc

public class Dog {

 public Dog(){

 System.out.println("Dog 类 : 类加载器为--"+ Dog.class.getClassLoader());

 


ClassLoaderTest01在sys下面:
1、如果Parent类在common下面,由子类加载,即loader2来加载。
 img src="http://img.blog.csdn.net/20160122230640800?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" / 
2、如果Parent类在sys下面
由父类加载器加载,即loader1来加载。
 img src="http://img.blog.csdn.net/20160122230703769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" / 
如果Parent在系统目录下
 img src="http://img.blog.csdn.net/20160122230726426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" / 
对于loader3,无论Parent类在哪目录下,Parent类始终由loader3来加载。

双亲委派模型与类加载器 我们都知道类都是通过类加载器被加载进虚拟机中的,那这个类加载器有哪些呢?我们平时写的代码又是通过什么类加载器被加载进虚拟机中的呢?类加载器的工作模式又是什么呢?带着疑问一起去学习下双亲委派模型与类加载器。
自定义类加载器 1. 在《类加载器》中讲的,默认类加载器只能加载固定路径下的class,如果有特定路径下的class,需要自定义 2. 安全性:系统自身需要一些jar,class,如果业务类代码中也有相同的class,破坏系统,类似双亲委托安全性 可以看看tomcat自定义类加载器的原因,别的就大同小异了 1. a)、要保证部署在tomcat上的每个应用依赖的类库相互独立,不受影响。 2. b)、由于tomcat是采用java语言编写的,它自身也有类库依赖,为了安全考虑,tomcat使用的类库要与部署的应用的类库相互独立。 3. c)、有些类库tomcat与部署的应用可以共享,比如说servlet-api,