国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

類加載與自定義類加載器(67)

2019-11-15 00:15:39
字體:
供稿:網(wǎng)友
類加載與自定義類加載器(67)

類加載

所有類加載器,都是ClassLoader的子類。

類加載器永遠(yuǎn)以.class運(yùn)行的目錄為準(zhǔn)。

讀取classpath根目錄下的文件有以下幾種方式:

1 在java項目中可以通過以下方式獲取classspath下的文件:

public void abc(){        //每一種讀取方法,使用某個類獲取Appclassloader        ClassLoader cl = ReadFile.class.getClassLoader();        URL url = cl.getResource("a.txt");        System.err.

在Tomcat中tomcat又聲明了兩個類載器:

StandardClassLoader– 加載tomcat/lib/*.jar - serlvetapi.jar

Webappclassloader /加載 tomcat/webapps/project/web-inf/lib/*.jar && web-inf/classes/*.class

在任何的項目中,獲取類的加載器都應(yīng)該使用以下方式:

SomeClass(你寫的).class.getClassLoader().getResource ;獲取到這個類的類加載器

在java項目中是:AppClassLoader

在Web項目中:WebAppClassLoader

測試父類加載器:

public class OneServlet extends HttpServlet {    @Override    public void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        ClassLoader loader = OneServlet.class.getClassLoader();//WebAppClassLoader        int index=1;        while(loader!=null){            System.err.println((index++)+"類加載器是:"+loader.getClass());                     loader=loader.getParent();//獲取父類加載器        }    }}

運(yùn)行的結(jié)果:

1類加載器是:class org.apache.catalina.loader.WebappClassLoader2類加載器是:class org.apache.catalina.loader.StandardClassLoader3類加載器是:class sun.misc.Launcher$AppClassLoader4類加載器是:class sun.misc.Launcher$ExtClassLoader
自定義類加載器

JDK以哪一個類加載器讀取A類的字節(jié)碼,則A類就是被哪一個類加載器加載 的。

一個同名的類,是否可以相互轉(zhuǎn)換,要看是否是在同個類加載器中。

package cn.hx.demo;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.net.URL;public class MyClassLoader2 extends ClassLoader {    /**     * name:cn.itcast.demo.Person     * 根據(jù)包名找到.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.class.getClassLoader().getResource(name);            System.err.println(">>:"+url.getPath());            File file = new File(url.getPath());            InputStream in = new FileInputStream(file);            //讀取這個.class文件的字節(jié)碼            byte[] b = new byte[in.available()];//直接聲明這個字節(jié)大小為這個文件的大小            int len = in.read(b);//len=621            System.err.println(len);            /**             * 第一個參數(shù)是類名             */            cls = defineClass(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是 AppClassLoader        System.err.println(">>:"+Person.class.getClassLoader());        //由于o是由mc加載的。而Person是由App加載的,所有不可以轉(zhuǎn)換=來自于兩個不同的加載器        //Person p = (Person) o;//類型轉(zhuǎn)換錯誤ClassCastException        //System.err.println(p);    }}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 房山区| 东平县| 固安县| 乐陵市| 和政县| 汾西县| 称多县| 阳高县| 乡城县| 南汇区| 将乐县| 西乌珠穆沁旗| 洛阳市| 鹿邑县| 农安县| 兴文县| 大庆市| 大名县| 松滋市| 黔西| 河南省| 定西市| 逊克县| 上饶市| 揭西县| 扎囊县| 易门县| 改则县| 通道| 探索| 武宣县| 东台市| 白水县| 都江堰市| 兴安县| 阿尔山市| 木兰县| 平潭县| 莱西市| 宁波市| 黎城县|