最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 類加載與自定義類加載器詳解

 更新時(shí)間:2017年01月21日 09:01:56   作者:鄭宏鑫erke  
本文主要介紹了java 類加載與自定義類加載器。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧

類加載

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

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

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

1 在Java項(xiàng)目中可以通過(guò)以下方式獲取classspath下的文件:

public void abc(){
    //每一種讀取方法,使用某個(gè)類獲取Appclassloader
    ClassLoader cl = ReadFile.class.getClassLoader();
    URL url = cl.getResource("a.txt");
    System.err.println("url1 is:"+url.getPath());
    
    //第二種方式,直接使用ClassLoader
    URL url2 = ClassLoader.getSystemResource("a.txt");
    System.err.println("url2 is:"+url2.getPath());
}

在Tomcat中tomcat又聲明了兩個(gè)類載器:

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

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

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

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

在java項(xiàng)目中是:AppClassLoader

在Web項(xiàng)目中:WebAppClassLoader

測(cè)試父類加載器:

 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.WebappClassLoader
2類加載器是:class org.apache.catalina.loader.StandardClassLoader
3類加載器是:class sun.misc.Launcher$AppClassLoader
4類加載器是:class sun.misc.Launcher$ExtClassLoader

自定義類加載器

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

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

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);
      //讀取這個(gè).class文件的字節(jié)碼
      byte[] b = new byte[in.available()];//直接聲明這個(gè)字節(jié)大小為這個(gè)文件的大小
      int len = in.read(b);//len=621
      System.err.println(len);
      /**
       * 第一個(gè)參數(shù)是類名
       */
      cls = defineClass(classNameWithPackage,b,0,len);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return cls;
  }
}

測(cè)試類自定義類加載器

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)換=來(lái)自于兩個(gè)不同的加載器
    //Person p = (Person) o;//類型轉(zhuǎn)換錯(cuò)誤ClassCastException
    //System.err.println(p);
  }
}

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • SpringMVC實(shí)現(xiàn)數(shù)據(jù)綁定及表單標(biāo)簽

    SpringMVC實(shí)現(xiàn)數(shù)據(jù)綁定及表單標(biāo)簽

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)數(shù)據(jù)綁定及表單標(biāo)簽的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)

    Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)

    數(shù)據(jù)庫(kù)表中應(yīng)該都要有create_time、update_time字段;那么在開(kāi)發(fā)中,對(duì)于這些共有字段的處理應(yīng)該要進(jìn)行統(tǒng)一,這樣就可以簡(jiǎn)化我們的開(kāi)發(fā)過(guò)程。那么本文就對(duì)Mybatis-Plus中的字段自動(dòng)填充進(jìn)行記錄
    2021-11-11
  • 新手初學(xué)Java集合框架

    新手初學(xué)Java集合框架

    這篇文章主要介紹了JAVA集合框架的相關(guān)知識(shí),文中講解非常細(xì)致,幫助大家更好的理解學(xué)習(xí)JAVA框架,感興趣的朋友快來(lái)了解下,希望能給你帶來(lái)幫助
    2021-07-07
  • Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常

    Caused by: java.lang.ClassNotFoundException: org.objectweb.a

    這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Filter、Servlet、Listener的學(xué)習(xí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Filter、Servlet、Listener的學(xué)習(xí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Filter、Servlet、Listener的學(xué)習(xí)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • windows如何使用bat腳本后臺(tái)啟動(dòng)/停止和重啟jar包服務(wù)

    windows如何使用bat腳本后臺(tái)啟動(dòng)/停止和重啟jar包服務(wù)

    這篇文章主要介紹了windows使用bat腳本后臺(tái)啟動(dòng)/停止和重啟jar包服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn)

    SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java使用randomaccessfile在文件任意位置寫(xiě)入數(shù)據(jù)

    java使用randomaccessfile在文件任意位置寫(xiě)入數(shù)據(jù)

    Java在文件任意位置寫(xiě)入數(shù)據(jù)可以使用RandomAccessFile方法來(lái)完成,下面看一個(gè)簡(jiǎn)單的示例就明白了
    2014-01-01
  • 詳解Spring如何解決循環(huán)引用的問(wèn)題

    詳解Spring如何解決循環(huán)引用的問(wèn)題

    在Spring框架中,當(dāng)兩個(gè)或多個(gè)Bean之間存在相互依賴關(guān)系時(shí),可能會(huì)導(dǎo)致循環(huán)引用的問(wèn)題,循環(huán)引用指的是兩個(gè)或多個(gè)Bean之間互相依賴,形成一個(gè)循環(huán)鏈,本文將和大家一起探討Spring如何解決循環(huán)引用的問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08
  • Spring的IOC容器實(shí)例化bean的方式總結(jié)

    Spring的IOC容器實(shí)例化bean的方式總結(jié)

    IOC容器實(shí)例化bean的三種方式:構(gòu)造方法、靜態(tài)工廠、實(shí)例工廠,本文將通過(guò)代碼示例給大家詳細(xì)講解一下這三種方式,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

福安市| 临澧县| 鄂托克旗| 墨脱县| 绥棱县| 天水市| 栾川县| 镇沅| 博湖县| 万源市| 全州县| 海阳市| 万宁市| 巢湖市| 长春市| 沭阳县| 淮北市| 杭锦后旗| 大兴区| 张北县| 赫章县| 祁东县| 宝清县| 昌平区| 弋阳县| 诏安县| 开江县| 金山区| 梁平县| 临泉县| 安仁县| 安丘市| 襄城县| 沅江市| 乡城县| 黑山县| 平遥县| 通城县| 沁阳市| 东乡县| 株洲县|