成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細介紹java類加載的表現形式

開發 后端
本文介紹的是java類加載的表現形式,希望對你有幫助,一起來看。

Java中的類是動態加載的,我們先看一下我們常用的類加載方式,先有一個感性的認識,才能進一步深入討論,類加載無非就是下面三種方式。

  1. class A{}  
  2. class B{}  
  3. class C{}  
  4. public class Loader{  
  5. public static void main(String[] args) throws Exception{  
  6. Class aa=A.class;   
  7. Class bb=Class.forName("B");  
  8. Class cc=ClassLoader.getSystemClassLoader().loadClass("C");  
  9. }  

我們先看.class字面量方式,很多人可能不知道這種方式,因為這種用法不是一般java語法。通過javap我們可以發現,這種方式的大致等價于定義了一個靜態成員變量

  1. static Class class$0;(后面的編號是增長的) 

 

你可以試圖再定義一個 static Class class$0,應該會收到一個編譯錯誤(重復定義)。

  1. Class aa=A.class

就相當于

  1. if(class$0==null){  
  2. try{   
  3. Class.forName("A");  
  4. }  
  5. cacth(ClassNotFoundException e){  
  6. throw new NoClassDefFoundError(e);  
  7. }  
  8. }  
  9. Class aa=class$0

可以很清楚的看到,這種類的字面量定義其實不是加載類的方式,而是被編譯器處理了,實質上是使用了Class.forName方法,但是使用這種方式有一個很大的好處就是不用處理異常,因為編譯器處理的時候如果找不到類會拋出一個NoClassDefFoundError。也許你覺得需要處理ClassNotFoundException這種異常,事實上99%的情況下我們可以把這種異常認為是一個錯誤。所以大部分情況我們使用這種方式會更簡潔。

最常用的方式就是Class.forName方式了,這也是一個通用的上層調用。這個方法有兩個重載,可能很多人都忽略了第二個方法。

  1. public static Class forName(String name) throws ClassNotFoundException  
  2. public static Class forName(String name, boolean initialize,ClassLoader loader) 
  3. throws ClassNotFoundException 

第二個方法后面多了兩個參數,第二個參數表示是否初始化,第三個參數為指定的類加載器。

在上面的例子中:

  1. Class bb=Class.forName("B"); 

等價于

  1. Class bb=Class.forName("B",true,Loader.class.getClassLoader()); 

這里要詳細說一下這個類的初始化這個參數,如果這個參數為false的話,類中的static成員不會被初始化,static語句塊也不會被執行。

也就是類雖然被加載了,但是沒有被初始化,不過在第一次使用時仍然會初始化。所以我們有時候會看到Class.forName("XXX").newInstance()這樣的語句,為什么這里要創建一個不用的實例呢?不過是為了保證類被初始化(兼容以前的系統)。

其實第二個方法是比較難用的,需要指定類加載器,如果不指定而且又沒有安裝安全管理器的化,是無法加載類的,只要看一下具體的實現就明白了。

最本質的方式當然是直接使用ClassLoader加載了,所有的類最終都是通過ClassLoader加載的,

  1. Class cc=ClassLoader.getSystemClassLoader().loadClass("C"); 

這里通過使用系統類加載器來加載某個類,很直接的方式,但是很遺憾的是通過這種方式加載類,類是沒有被初始化的(也就是初始化被延遲到真正使用的時候).不過我們也可以借鑒上面的經驗,加載后實例化一個對象Class cc=ClassLoader.getSystemClassLoader().loadClass("C").newInstance()。

這里使用了系統類加載器,也是最常用的類加載器,從classpath中尋找要加載的類。java中默認有三種類加載器:引導類加載器,擴展類加載器,系統類加載器。java中的類加載有著規范的層次結構,如果我們要了解類加載的過程,需要明確知道哪個類被誰加載,某個類加載器加載了哪些類等等,就需要深入理解ClassLoader的本質。

以上只是類加載的表面的東西,我們還將討論深層次的東西。

責任編輯:于鐵 來源: 互聯網
相關推薦

2009-08-04 14:06:39

ASP.NET屬性表現

2010-06-09 14:43:27

2022-06-10 10:00:04

數字孿生監管運營流程

2016-02-24 11:25:43

DevOps運維

2021-08-06 10:02:14

圖表餅圖聯系圖表

2020-08-20 09:49:10

物聯網數據技術

2011-07-12 10:24:17

類加載反射

2023-03-20 00:04:07

2021-06-10 18:59:41

Java編程語言

2017-07-12 16:07:49

大數據數據可視化

2010-03-16 14:58:15

Java類加載器

2023-04-14 17:47:47

2011-07-18 10:21:04

iOS Visual Stu iphone

2009-09-15 13:20:34

LINQ DataCo

2010-08-24 09:19:59

2011-11-03 13:18:19

交換機故障方法

2021-04-07 06:11:37

Css前端CSS定位知識

2021-09-09 16:44:30

數字人民幣移動支付中國人民銀行

2021-08-28 07:48:04

AndroidActivityRecActivitySta

2022-11-30 16:12:42

智慧城市智慧農業物聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区在线 | 韩日精品一区 | 在线免费观看黄色 | 少妇性l交大片免费一 | 日本不卡视频在线播放 | 国产午夜久久久 | 国产激情一区二区三区 | 久久久久久久久久久久一区二区 | 日韩欧美综合 | 午夜网站视频 | 久久夜视频 | 人人射人人插 | 一级毛片在线播放 | 国产欧美日韩在线观看 | 日韩www视频 | 亚洲高清免费观看 | 欧美日韩综合 | 天堂久久久久久久 | 伦理午夜电影免费观看 | 午夜影院在线观看 | 黑人巨大精品欧美一区二区免费 | 日本激情视频中文字幕 | 中文字幕一区二区在线观看 | 国产精品亚洲综合 | 国产中文字幕网 | 二区av| 精品国产免费人成在线观看 | 一区二区三区中文字幕 | 久久久久亚洲精品 | 国产在线精品一区二区三区 | 日日网| 精品一区二区三区不卡 | 欧美日本亚洲 | 欧美日韩在线一区二区三区 | 91视频免费| 91在线观看 | 91av在线影院 | 亚洲精品99999 | 在线观看av网站 | 亚洲精品视频在线观看免费 | 国产日韩一区 |