JAVA虛擬機加載類的方式解析

      虛擬機加載類的途徑 
      1
      、由 new 關鍵字創建一個類的實例 
        
      在由運行時刻用 new 方法載入 
        
      如:Dog dog new Dog(); 
      2
      、調用 Class.forName() 方法 
        
      通過反射加載類型,并創建對象實例 
        
      如:Class clazz Class.forName“Dog”); 
             Object dog
      clazz.newInstance(); 
      3
      、調用某個 ClassLoader 實例的 loadClass() 方法 
        
      通過該 ClassLoader 實例的 loadClass() 方法載入。應用程序可以通過繼承 ClassLoader 實現自己的類裝載器。 
        
      如:Class clazz classLoader.loadClass“Dog”); 
             Object dog
      clazz.newInstance();
      三者的區別: 
      1
      2使用的類加載器是相同的,都是當前類加載器。(即:this.getClass.getClassLoader)。3由用戶指定類加載器。如果需要在當前類路徑以外尋找類,則只能采用第3種方式。第3種方式加載的類與當前類分屬不同的命名空間。另外,1是靜態加載,23是動態加載 
      兩個異常(exception) 
      靜態加載的時候如果在運行環境中找不到要初始化的類,拋出的是NoClassDefFoundError,它在JAVA的異常體系中是一個Error 
      動態加載的時候如果在運行環境中找不到要初始化的類,拋出的是ClassNotFoundException,它在JAVA的異常體系中是一個checked異常 
      Class.forName
      ClassLoader.loadClass區別 
      Class
      的裝載包括3個步驟:加載(loading,連接(link,初始化(initialize
      Class.forName(className)
      實際上是調用Class.forName(className, true, this.getClass().getClassLoader())。第二個參數,是指Classloading后是不是必須被初始化。 
      ClassLoader.loadClass(className)
      實際上調用的是ClassLoader.loadClass(name, false),第二個參數指Class是否被link 
      Class.forName(className)
      裝載的class已經被初始化,而ClassLoader.loadClass(className)裝載的class還沒有被link。一般情況下,這兩個方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。 
      例如,在JDBC編程中,常看到這樣的用法,Class.forName("com.mysql.jdbc.Driver"). 
      如果換成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。 
      com.mysql.jdbc.Driver
      的源代碼如下: 
      Java
      代碼

      // Register ourselves with the DriverManager   

      static {   

          try {   

              java.sql.DriverManager.registerDriver(new Driver());   

          } catch (SQLException E) {   

              throw new RuntimeException("Can't register driver!");   

          }   

      }  

      原來,Driverstatic塊中會注冊自己到java.sql.DriverManager。而static塊就是在Class的初始化中被執行。 
      所以這個地方就只能用Class.forName(className) 
      對于相同的類,JVM最多會載入一次。但如果同一個class文件被不同的ClassLoader載入,那么載入后的兩個類是完全不同的。因為已被加載的類由該類的類加載器實例與該類的全路徑名的組合標識。設有 packagename.A Class ,分別被類加載器 CL1 CL2 加載,所以系統中有兩個不同的 java.lang.Class 實例: <CL1, packagename.A> <CL2, packagename.A>
      北大青鳥網上報名
      北大青鳥招生簡章
      主站蜘蛛池模板: 国产小仙女视频一区二区三区| 国产精品无码一区二区三区电影 | 国产成人久久一区二区三区| 中文字幕人妻丝袜乱一区三区| 国产精品污WWW一区二区三区| 国产免费av一区二区三区| 天美传媒一区二区三区| 国产午夜精品一区二区三区小说| 中文字幕无码一区二区三区本日 | 韩国女主播一区二区| 亚洲片一区二区三区| 少妇激情一区二区三区视频| 国产精品亚洲专一区二区三区| 日本中文字幕一区二区有码在线| 在线电影一区二区三区| 福利一区二区三区视频在线观看 | 亚洲一区二区免费视频| 无码人妻久久一区二区三区蜜桃 | 国产亚洲自拍一区| 亚洲日韩一区精品射精| 色欲综合一区二区三区| 无码一区二区三区免费| 一本AV高清一区二区三区| 一本色道久久综合一区| 狠狠爱无码一区二区三区| 国产日韩精品一区二区三区| 亚洲无码一区二区三区| 少妇一夜三次一区二区| 国精产品一区一区三区MBA下载| 国产精品一区二区久久精品涩爱| 末成年女A∨片一区二区| 性色A码一区二区三区天美传媒 | 成人精品一区二区三区校园激情| 中文字幕日韩一区二区不卡| 夜夜精品视频一区二区| 日韩AV在线不卡一区二区三区| 国产福利在线观看一区二区| 爱爱帝国亚洲一区二区三区 | 亚洲欧洲精品一区二区三区| 性无码免费一区二区三区在线| 麻豆精品久久久一区二区|