1、 自定义类加载器1、类绑定package cn.itcast.demo;public class BoundDemo public static void main(String args) A a = new B();System.err.println(a.age);/100System.err.println(a.num);/100a.abc();/abc.1000 所有非静态分开方法都是在运行时绑定,动态绑定,其他的都是静态绑定/静态绑定是指在编译时已经指定引用的就是静态绑定a.aaa();/aaa.100class Apublic int age=100;public static
2、int num = 100;public void abc()System.err.println(“abc.100“);public static void aaa()System.err.println(“aaa.100“);class B extends Apublic int age=1000;public static int num = 1000;public void abc()System.err.println(“abc.1000“);public static void aaa()System.err.println(“aaa.1000“);1、 类加载所有类加载器,都是
3、ClassLoader 的子类。类加载器永远以.class 运行的目录为准。读取 classpath 根目录下的文件有以下几种方式:在 Java 项目中可以通过以下方式获取 classspath 下的文件:public void abc()/每一种读取方法,使用某个类获取AppclassloaderClassLoader cl = ReadFile.class.getClassLoader();URL url = cl.getResource(“a.txt“);System.err.println(“url1 is:“+url.getPath();/第二种方式,直接使用ClassLoaderU
4、RL url2 = ClassLoader.getSystemResource(“a.txt“);System.err.println(“url2 is:“+url2.getPath();在 Tomcat 中 tomcat 又声明了两个类载器:StandardClassLoader 加载 tomcat/lib/*.jar - serlvetapi.jarWebappclassloader /加载 tomcat/webapps/project/web-inf/lib/*.jar /WebAppClassLoaderint index=1;while(loader!=null)System.err
5、.println(index+)+“类加载器是:“+loader.getClass();loader=loader.getParent();/获取父类加载器Comment W1: Comment W2: 接收的是类名:cn.itcast.demo.PersonComment W3: 处理成路径名运行的结果:1类加载器是:class org.apache.catalina.loader.WebappClassLoader2类加载器是:class org.apache.catalina.loader.StandardClassLoader3类加载器是:class sun.misc.Launcher
6、$AppClassLoader4类加载器是:class sun.misc.Launcher$ExtClassLoader2、 自定义类加载器JDK以哪一个类加载器读取 A类的字节码,则 A类就是被哪一个类加载器加载 的。一个同名的类,是否可以相互转换,要看是否是在同个类加载器中。package cn.itcast.demo;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import .URL;public class MyClassLoader2 extends ClassLoader
7、 /* name:cn.itcast.demo.Person* 根据包名找到.class文件* cn.itcast.demo.person = cn/itcast/demo/Person.class*/public Class findClass(String name) throws ClassNotFoundException String classNameWithPackage=name;Class cls = null;try /先将name = name.replace(“.“,“/“);name +=“.class“;/确定目录URL url = MyClassLoader2.c
8、lass.getClassLoader().getResource(name);System.err.println(“:“+url.getPath();File file = new File(url.getPath();InputStream in = new FileInputStream(file);/读取这个.class文件的字节码byte b = new bytein.available();/直接声明这个字节大小为这个文件的大小int len = in.read(b);/len=621System.err.println(len);/* 第一个参数是类名*/cls = defin
9、eClass(classNameWithPackage,b,0,len); catch (Exception e) e.printStackTrace();return cls;测试类自定义类加载器“public class ClassLoaderDemo public static void main(String args) throws Exception MyClassLoader2 mc = new MyClassLoader2();Class cls = mc.findClass(“cn.itcast.demo.Person“);Object o = cls.newInstance();System.err.println(“toString:“+o+“,“+o.getClass().getClassLoader();/直接使用peron 是 AppClassLoaderSystem.err.println(“:“+Person.class.getClassLoader();/由于o是由mc加载的。而Person是由App加载的,所有不可以转换来自于两个不同的加载器/Person p = (Person) o;/类型转换错误ClassCastException/System.err.println(p);