自定义类加载器1、类绑定packagecn.itcast.demo;publicclassBoundDemo{publicstaticvoidmain(String[]args){Aa=newB();System.err.println(a.age);//100System.err.println(a.num);//100a.abc();//abc...1000所有非静态分开方法都是在运行时绑定,动态绑定,其他的都是静态绑定//静态绑定是指在编译时已经指定引用的就是静态绑定a.aaa();//aaa..100}}classA{publicintage=100;publicstaticintnum=100;publicvoidabc(){System.err.println("abc....100");}publicstaticvoidaaa(){System.err.println("aaa....100");}}classBextendsA{publicintage=1000;publicstaticintnum=1000;publicvoidabc(){System.err.println("abc....1000");}publicstaticvoidaaa(){System.err.println("aaa....1000");}}1、类加载所有类加载器,都是ClassLoader的子类。类加载器永远以.class运行的目录为准。读取classpath根目录下的文件有以下几种方式:在Java项目中可以通过以下方式获取classspath下的文件:publicvoidabc(){//每一种读取方法,使用某个类获取AppclassloaderClassLoadercl=ReadFile.class.getClassLoader();URLurl=cl.getResource("a.txt");System.err.println("url1is:"+url.getPath());//第二种方式,直接使用ClassLoaderURLurl2=ClassLoader.getSystemResource("a.txt");System.err.println("url2is:"+url2.getPath());}在Tomcat中tomcat又声明了两个类载器:StandardClassLoader–加载tomcat/lib/*.jar-serlvetapi.jarWebappclassloader/加载tomcat/webapps/project/web-inf/lib/*.jar&&web-inf/classes/*.class在任何的项目中,获取类的加载器都应该使用以下方式:SomeClass(你写的).class.getClassLoader().getResource;获取到这个类的类加载器在java项目中是:AppClassLoader在Web项目中:WebAppClassLoader测试父类加载器:publicclassOneServletextendsHttpServlet{@OverridepublicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ClassLoaderloader=OneServlet.class.getClassLoader();//WebAppClassLoaderintindex=1;while(loader!=null){System.err.println((index++)+"类加载器是:"+loader.getClass());loader=loader.getParent();//获取父类加载器}}}运行的结果:1类加载器是:classorg.apache.catalina.loader.WebappClassLoader2类加载器是:classorg.apache.catalina.loader.StandardClassLoader3类加载器是:classsun.misc.Launcher$AppClassLoader4类加载器是:classsun.misc.Launcher$ExtClassLoader2、自定义类加载器JDK以哪一个类加载器读取A类的字节码,则A类就是被哪一个类加载器加载的。一个同名的类,是否可以相互转换,要看是否是在同个类加载器中。packagecn.itcast.demo;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.net.URL;publicclassMyClassLoader2extendsClassLoader{/***name:cn.itcast.demo.Person*根据包名找到.class文件*cn.itcast.demo.person=>cn/itcast/demo/Person.class*/publicClass>findClass(Stringname)throwsClassNotFoundException{StringclassNameWithPackage=name;Class>cls=null;try{//先将name=name.replace(".","/");name+=".class";//确定目录URLurl=MyClassLoader2.class.getClassLoader().getResource(name);System.err.println(">>:"+url.getPath());Filefile=newFile(url.getPath());InputStreamin=newFileInputStream(file);//读取这个.class文件的字节码byte[]b=newbyte[in.available()];//直接声明这个字节大小为这个文件的大小intlen=in.read(b);//len=621System.err.println(len);/***第一个参数是类名*/cls=defineClass(classNameWithPackage,b,0,len);}catch(Exceptione){e.printStackTrace();}returncls;}}测试类自定义类加载器“publicclassClassLoaderDemo{publicstaticvoidmain(String[]args)throwsException{MyClassLoader2mc=newMyClassLoader2();Classcls=mc.findClass("cn.itcast.demo.Person");Objecto=cls.newInstance();System.err.println("toString:"+o+","+o.getClass().getClassLoader());//直接使用peron是AppClassLoaderSystem.err.println(">>:"+Person.class.getClassLoader());//由于o是由mc加载的。而Person是由App加载的,所有不可以转换=来自于两个不同的加载器//Personp=(Person)o;//类型转换错误ClassCastException//System.err.println(p);}}