欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

類加載

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

類加載器永遠以.class運行的目錄為準。

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

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

public void abc(){
    //每一種讀取方法,使用某個類獲取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又聲明了兩個類載器:

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();//獲取父類加載器
    }
  }
}

運行的結(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以哪一個類加載器讀取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);
  }
}

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

相關(guān)文章

最新評論