【JDK源码】java.lang包常用类详解
??接下來的幾天開始JDK源碼的學習和總結,之前看《java編程思想》的時候看到java的基礎知識有很多,其中支撐著這些基礎的基礎中的基礎當屬JDK。JDK的基礎代碼里面又分了很多基礎的模塊,今天從最基礎的java.lang包開始學習。本次JDK源碼學習系列以JDK1.7為準。
??觀察JDK的源碼,可以看到,java.lang包下面最為基礎和常用的幾個部分包括:常用的對象類型包,常用的異常類型包,常用的接口包,系統包,注解包,反射包,其它包。
一、常用的對象類型包
1、Object類
??類Object是類層次結構的根類。每個類都使用Object作為超類。所有對象(包括數組)都實現這個類的方法。在Object類的方法里面會經常用到hashCode()和==與equals()的區別,有關==、equals()和hashcode()的源碼分析請參看本人的另一篇博文。 java中的==、equals()、hashCode()源碼分析
2、字符串類
??在字符串類中,最常用到的是String、StringBuilder和StringBuffer三個類,有關這三個類的比較參看本人的一下博文: String Stringbuilder StringBuffer的區別和應用
??本次JDK源碼學習的是1.7版本,在這里簡單提一下,1.8版本里面String類還增加了join靜態方法用來結合多個字符串,有興趣的同學可自行搜索學習。
3、8種基本元素的包裝類
八種基本類型:
六種數字類型:
?? ?? 四個整數型(byte,short,int,long)
?? ??兩個浮點型(douvle,float)
一種字符類型:char
一種布爾型:boolean
包裝類對每種不同類型的基本進行了包裝,并提供了相應的操作方法。
二、常用的異常類型包
1、Throwable類
??Throwable類是java中所有錯誤或者異常的超類,只有當對象是此類(或者其子類之一)的實例時,才能通過JVM或者Java的throw語句拋出。類似的,只有Throwable類或者其子類才可以是catch子句中的參數類型。Throwable包含了其線程創建時線程執行堆棧的快照。它還包含了給出有關錯誤更多信息的消息字符串。
2、Error類
??Error類是Throwable類的子類,這種異常一般表示與JVM有關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。
3、Exception類
??Exception類也是Throwable類的子類,這種異常是程序可以處理、可以恢復的異常,對于這種異常應該在代碼中進行處理,不應該被程序最終拋出。Exception類又被分為兩類,一類是需要檢查的異常,是被強制要在代碼中進行處理,一類是運行時異常,是在代碼運行時出現的。
三、常用的接口包
1、Comparable接口
??Comparable接口用于可以比較大小的類。此接口強行對實現它的每個類的對象進行整體排序,這種排序被稱為類的自然排序,類的comparaTo方法被稱為它的自然比較方法。
??實現此接口的對象列表(和數組)可以通過Collection.sort和Arrays.sort進行自動排序。實現此接口的對象可以用做有序映射中的鍵或有序集合中的元素,無需指定比較器。
2、Runable接口
??Runnable 接口應該由那些打算通過某一線程執行其實例的類來實現。類必須定義一個稱為 run 的無參數方法。設計該接口的目的是為希望在活動時執行代碼的對象提供一個公共協議。例如,Thread 類實現了 Runnable。
??此外,Runnable 為非 Thread 子類的類提供了一種激活方式。通過實例化某個 Thread 實例并將自身作為運行目標,就可以運行實現 Runnable 的類而無需創建 Thread 的子類。大多數情況下,如果只想重寫 run() 方法,而不重寫其他 Thread 方法,那么應使用 Runnable 接口。這很重要,因為除非你打算修改或增強類的基本行為,否則不應為該類創建子類。有關Runable和Thread的區別和使用請參看本人的另一篇博文:【Java線程】Thread && Runnable必知必會
3、Cloneable接口
??實現了Cloneable接口的類可以合法的使用Object.clone()方法對其實例進行按字段復制。 如果在沒有實現 Cloneable 接口的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常。 按照慣例,實現此接口的類應該使用公共方法重寫 Object.clone(它是受保護的)。
??注意,此接口不 包含 clone 方法。因此,因為某個對象實現了此接口就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
??有關java對象的克隆以及屬性拷貝請參看本人以下博文:Java提高—對象克隆(復制)/對象屬性拷貝深復制淺復制: 深復制VS淺復制(MemberwiseClone方法介紹)
4、Iterable接口
Iterable接口表示這個類可以執行foreach循環操作。
四、系統包
1、System類
??System類包含一些有用的類字段和方法,是final類型,所以不能被實例化。在System類提供的設施中,有標準輸入、標準輸出和錯誤輸出流;對外部定義的屬性和環境變量的訪問;加載文件和庫的方法;還有快速復制數組的一部分實用方法。
2、 Runtime類
?? Runtime類里面可以獲得應用運行時的一些狀態(主要包括使用的內存和cpu個數)和在應用運行時執行一些操作(程序退出、執行gc、設置退出時的鉤子函數)。
3、 Thread類
?? Thread類里面包括了線程相關的操作,主要有線程屬性的設置(優先級、名稱、類別)和改變線程運行狀態(啟動、睡眠、中斷等)。Thread的sleep()和wait()方法的區別
4、ThreadLocal類
??該類提供了線程局部 (thread-local) 變量。這些變量不同于它們的普通對應物,因為訪問某個變量(通過其 get 或 set 方法)的每個線程都有自己的局部變量,它獨立于變量的初始化副本。ThreadLocal 實例通常是類中的 private static 字段,它們希望將狀態與某一個線程(例如,用戶 ID 或事務 ID)相關聯。每個線程都保持對其線程局部變量副本的隱式引用,只要線程是活動的并且 ThreadLocal 實例是可訪問的;在線程消失之后,其線程局部實例的所有副本都會被垃圾回收(除非存在對這些副本的其他引用)。
五、注解包
??這個系列的提供了可以用于自定義注解方法和一些常用的注解,其中最為重要的就是FunctionalInterface注解,一個接口如果使用了這個注解,則表示了具有lambda特性的接口。
六、反射包
??這個系列使得我們可以通過反射的方式得到對象的屬性或者通過反射的方式執行對象的方法。主要常用的有Field、Method、Construct、Paramter、Array、Proxy幾個類。
1、AccessibleObject類
??java.lang.reflect.AccessibleObject類是Field,Method和Constructor類對象的基類。 它提供了將反射對象標記為在使用它時抑制默認Java語言訪問控制檢查的功能。 當使用Fields,Methods或Constructors類對象來設置或獲取字段,調用方法,或創建和初始化新的類實例時,執行訪問分別檢查(對于public,默認(包)訪問,protected和private成員) 。 在反射對象中設置可訪問標志允許具有足夠權限的復雜應用程序(如Java對象序列化或其他持久性機制)以被禁止的方式操作對象。
2、Array類
??java.lang.reflect.Array類提供靜態方法來動態創建和訪問Java數組。 Array允許在get或set操作期間擴展轉換,但如果發生縮小轉換,則會拋出IllegalArgumentException異常。
3、Constructor類
??java.lang.reflect.Constructor類提供了一個類的單個構造函數的信息和訪問權限。 構造函數允許在將實際參數傳到newInstance()與底層構造函數的形式參數進行匹配時進行擴展轉換,但如果發生縮小轉換,則會拋出IllegalArgumentException異常。
4、Field類
??java.lang.reflect.Field類提供有關類或接口的單個字段的信息和動態訪問。反射的字段可以是類(靜態)字段或實例字段。字段允許在獲取或設置訪問操作期間擴展轉換,但如果發生縮小轉換,則會引發IllegalArgumentException。
5、Method類
??java.lang.reflect.Method類提供有關類或接口上單個方法的信息和訪問權限。反映的方法可以是類方法或實例方法(包括抽象方法)。 當匹配實際參數以使用底層方法的形式參數調用時,方法允許擴展轉換,但如果發生縮小轉換,則會引發IllegalArgumentException異常。
6、Modifier類
??java.lang.reflect.Modifier類提供了用于解碼類和成員訪問修飾符的靜態方法和常量。修飾符集合被表示為具有表示不同修飾符的不同位位置的整數。表示修飾符的常量的值取自“Java虛擬機規范”第4.1,4.4,4.5和4.7節中的表中。
7、Proxy類
??java.lang.reflect.Proxy類提供用于創建動態代理類和實例的靜態方法,它也是由這些方法創建的所有動態代理類的超類。
??動態代理的使用在日常工作也會經常用到,如果理解不清楚,這部分的內容也是有一定的難度。通過學習源碼可以加深自己對動態代理的理解,參看本人以下博文: 【動態代理】從源碼實現角度剖析JDK動態代理
七、其它包
其他類包括了一些不是太常用,但是在某些場景下特別有用的工具。
(1)Ref包提供了與Java垃圾回收器密切相關的引用類。這些引用類對象可以指向其它對象,但它們不同于一般的引用,因為它們的存在并不防礙Java垃圾回收器對它們所指向的對象進行回收。其好處就在于使者可以保持對使用對象的引用,同時JVM依然可以在內存不夠用的時候對使用對象進行回收。
(2)Management包提供提供管理接口,用于監視和管理Java虛擬機以及Java虛擬機在其上運行的操作系統。最常用的有MemoryMXBean、MemoryPoolMXBean、RuntimeMXBean、ThreadMXBean四個獲得不同類型數據的MXBean。
(3)Instrument包提供了提供允許Java編程語言代理檢測運行在JVM上的程序的服務,利用它提供的Instrumentation類和ClassFileTrasformation類,利用這兩個類加上-javaagent命令,可以在程序運行之前,完成對字節碼的修改,利用這個方法可以有效的對程序進行監控。
java.lang包常用類和方法的思維導圖:
總結
以上是生活随笔為你收集整理的【JDK源码】java.lang包常用类详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【抓包工具】Wireshark(详细介绍
- 下一篇: 【抓包工具】Fiddler(详细介绍)