日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射中Class.forName()和ClassLoader.loadClass()的区别

發布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射中Class.forName()和ClassLoader.loadClass()的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 Java類裝載過程

裝載:通過累的全限定名獲取二進制字節流,將二進制字節流轉換成方法區中的運行時數據結構,在內存中生成Java.lang.class對象;

鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;

校驗:檢查導入類或接口的二進制數據的正確性;(文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證)

準備:給類的靜態變量分配并初始化存儲空間;

解析:將常量池中的符號引用轉成直接引用;

初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊,并初始化程序員設置的變量值。

二 分析 Class.forName()和ClassLoader.loadClass

Class.forName(className)方法,內部實際調用的方法是 Class.forName(className,true,classloader);第2boolean參數表示類是否需要初始化, Class.forName(className)默認是需要初始化。一旦初始化,就會觸發目標對象的 static塊代碼執行,static參數也也會被再次初始化。ClassLoader.loadClass(className)方法,內部實際調用的方法是 ClassLoader.loadClass(className,false);第2boolean參數,表示目標對象是否進行鏈接,false表示不進行鏈接,由上面介紹可以,不進行鏈接意味著不進行包括初始化等一些列步驟,那么靜態塊和靜態對象就不會得到執行

三 數據庫鏈接為什么使用Class.forName(className)

JDBC Driver源碼如下,因此使用Class.forName(classname)才能在反射回去類的時候執行static塊。

static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");} }

轉載原文鏈接:http://www.cnblogs.com/zabulon/p/5826610.html

總結

以上是生活随笔為你收集整理的反射中Class.forName()和ClassLoader.loadClass()的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。