




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2、掌握并發包下的隊列5、掌握反射和動態代理.1.java多線程基本知識.1.1.進程介紹專門負責當前這個程序的運行。會相互的影響。我們把每個獨立應用程序在內存的獨立空間稱為當前應用程序運行的一個進調度當前程序中的所有運行細節。.1.2.線程介紹它們都位于當前QQ這個軟件運行時所分配的內容的獨立空間中。成多個運行區域,每個獨立的小區域(小單元)稱為一個線程。線程:它是位于進程中,負責當前進程中的某個具備獨立運行資格的空間。程。.1.3.多線程介紹有線程。真正可以完成程序運行和功能的實現靠的是進程中的線程。多線程的目的:提高程序的運行效率。.1.4.多線程運行的原理行程序的過程中某個時刻點上,它其實只能運行一個程序。而不是多個程序。而Cbn它可以在多個程序之間進行高速的切換。而切換頻率和速度太快,導致人的肉看看不到。但不能無限制的開線程。.1.5.實現線程的兩種方式SRunnable的類.2.1.synchronized代碼塊中放操作共享數據的代碼。}有兩種情況:T)獲取鎖的線程執行完了該代碼塊,然后線程釋放對鎖的占有;2)線程執行發生異常,此時JVM會讓線程自動釋放鎖。如果這個獲取鎖的線程由于要等待IO或者其他原因(比如調用sleep方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能干巴巴地等待,試想一下,這多么影響程序執行效率。因此就需要有一種機制可以不讓等待的線程一直無期限地等待下去(比如只等待一定的時間或者能夠響應中斷),通過Lock就可以辦到。突現象,但是讀操作和讀操作不會發生沖突現象。nchronizedzed2.2lockLock是一個類,通過這個類可以實現同步訪問;2)Lock和synchronized有一點非常大的不同,采用synchronized不需要用戶去手動釋鎖,當synchronized方法或者synchronized代碼塊執行完之后,系統會自動讓線程釋放對鎖的占用;而Lock則必須要用戶去手動釋放鎖,如果沒有主動釋放鎖,就有可能導致出現?java.util.concurrent.locks包下常用的類Lock明的就是Lock,通過查看Lock的源碼可知,Lock是一個接口:publicpublicinterfaceLock{voidlock();voidlockInterruptibly()throwsInterruptedException;booleantryLock();booleantryLock(longtime,TimeUnitunit)throwsInterruptedException;voidunlock();}lyunLock()方法是用來釋放鎖的。ReadWriteLocklock()方法是平常使用得最多的一個方法,就是用來獲取鎖。如果鎖已被其他線程獲取,由于在前面講到如果采用Lock,必須主動去釋放鎖,并且在發生異常時,不會自動釋塊中進行,以保證鎖一定被被釋放,防止死鎖的發生。tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取),則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。tryLock(longtime,TimeUnitunit)方法和tryLock()方法是類似的,只不過區別在于這個方法在拿不到鎖時會等待一定的時間,在時間期限之內如果還拿不到鎖,就返回false。如果如果一開始拿到鎖或者在等待期間內拿到了鎖,則返回true。lockInterruptibly()方法比較特殊,當通過這個方法去獲取鎖時,如果線程正在等待獲取鎖,則這個線程能夠響應中斷,即中斷線程的等待狀態。也就使說,當兩個線程同時通過注意,當一個線程獲取了鎖之后,是不會被interrupt()方法中斷的。因此當通過lockInterruptibly()方法獲取某個鎖時,如果不能獲取到,只有進行等待的情況下,是可以響應中斷的。而用synchronized修飾的話,當一個線程處于等待某個鎖的狀態,是無法被中斷的,只有一直等待下去。ReentrantLock“可重入鎖”。ReadWriteLock也是一個接口,在它里面只定義了兩個方法:publicpublicinterfaceReadWriteLock{/***Returnsthelockusedforreading.**@returnthelockusedforreading.kreadLock/***Returnsthelockusedforwriting.**@returnthelockusedforwriting.LockwriteLock();}來分配給線程,從而使得多個線程可以同時進行讀操作。下面的ReentrantReadWriteLock實ReentrantReadWriteLockReentrantReadWriteLock里面提供了很多豐富的方法,不過最主要的有兩個方法:ReadWriteLock果不過要注意的是,如果有一個線程已經占用了讀鎖,則此時其他線程如果要申請寫鎖,則申請寫鎖的線程會一直等待釋放讀鎖。程會一直等待釋放寫鎖。Lock和synchronized的選擇LocksynchronizedJavasynchronized言而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因等待的線程會一直等待下去,不能夠響應中斷;4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。5)Lock可以提高多個線程進行讀操作的效率。時(即有大量線程同時競爭),此時Lock的性能要遠遠優于synchronized。所以說,在具體使用時要根據適當情況選擇。.1.java并發包介紹JDK5.0以后的版本都引入了高級并發特性,大多數的特性在java.util.concurrent包中,發應用程序。主要包含原子量、并發集合、同步器、可重入鎖,并對線程池的構造提供了強力的支持。線程池r在構造函數中的參數4是線程池的大小,你可以隨意設置,也可以和cpu的數量保持一NumsRuntimegetRuntimeavailableProcessors5、SingleThreadScheduledPool:只有一個線程,用來調度執行將來的任務,代碼:Executors.newSingleThreadScheduledExecutor()線程池的使用提交Runnable,任務完成后Future對象返回null提交Callable,該方法返回一個Future實例表示任務的狀態.2.java并發包消息隊列及在開源軟件中的應用BlockingQueue也是java.util.concurrent下的主要用來控制線程同步的工具。插插入:2)offer(anObject):表示如果可能的話,將anObject加到BlockingQueue里,即如果putanObjectanObjectBlockingQueue果BlockQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue里面有空間再繼續.4)poll(time):取走BlockingQueue里排在首位的對象,若不能立即取出,則可以等timenull5)take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到Blocking有新的對象被加入為止他intremainingCapacity();返回隊列剩余的容量,在隊列插入和獲取的時候,不要瞎搞,數據可能不準booleanremove(Objecto);從隊列移除元素,如果存在,即移除一個或者更多,隊列改publicbooleancontains(Objecto);查看隊列是否存在這個元素,存在返回trueintdrainTo(Collection<?superE>c);傳入的集合中的元素,如果在隊列中存在,那么將隊列中的元素移動到集合中intdrainTo(Collection<?superE>c,intmaxElements);和上面方法的區別在于,制定了移動的數量BlockingQueue有四個具體的實現類,常用的兩種實現類為:1、ArrayBlockingQueue:一個由數組支持的有界阻塞隊列,規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的。2、LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由IntegerMAXVALUE含的對象是以FIFO(先入先出)順序排序的。LinkedBlockingQueue可以指定容量,也可以不指定,不指定的話,默認最大是takeput隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣,導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的yBlockingQueue代碼消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異JMS是一種與廠商無關的API,用來訪問消息收發系統消息。它類似于JDBC(JavaJMSMQSeries、BEA的WeblogicJMSservice和Progress的SonicMQ,這只是幾個例子。JMS使您能夠通過消息收發服務(有時稱為消息中介程序或路由器)從一個JMS客戶機向另一個JMS客戶機發送消息。消息是JMS中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶著應用程序的數據或有效負載。根據有效負載的類型來劃分,可以將消息分為幾種類型,它們分別攜帶:簡單文本(TextMessage)、可序列化的對象(ObjectMessage)、屬性集合(MapMessage)、字節流BytesMessage)、原始值流(StreamMessage),還有無有效負載的消息(Message)。.2.JMS規范.2.1.專業技術規范JMS(JavaMessagingService)是Java平臺上有關面向消息中間件(MOM)的技術規范,它便于消息系統中的Java應用程序進行消息交換,并且通過提供標準的產生、發送、接收消息的.2.2.體系架構JMS由以下元素組成。Java面向消息中間件的適配器。JMS客戶:生產或消費基于消息的Java的應用程序或對象。JMS生產者:創建并發送消息的JMS客戶。JMSJMS。JMS消息:包括可以在JMS客戶之間傳遞的數據的對象JMS隊列:一個容納那些被發送的等待閱讀的消息的區域。與隊列名字所暗示的意思不同,JMS主題:一種支持發送消息給多個訂閱者的機制。.2.3.Java消息服務應用程序結構支持兩種模型在點對點或隊列模型下,一個生產者向一個特定的隊列發布消息,一個消費者從該隊列中讀取消息。這里,生產者知道消費者的隊列,并直接將消息發送到消費者的隊列。只有一個消費者將獲得消息生產者不需要在接收者消費該消息期間處于運行狀態,接收者也同樣不需要在消息發送時處于運行狀態。每一個成功處理的消息都由接收者簽收2、發布者/訂閱者模型發布者/訂閱者模型支持向一個特定的消息主題發布消息。0或多個訂閱者可能對接收來自多個消費者可以獲得消息在發布者和訂閱者之間存在時間依賴性。發布者需要建立一個訂閱(subscription),以便客戶能夠訂閱。訂閱者必須保持持續的活動狀態以接收消息,除非訂閱者建立了持久的訂閱。在那種情況下,在訂閱者未連接時發布的消息將在訂閱者重新連接時重新發布。JavaJMS方式。同一組Java類可以通過JNDI中關于提供者的信息,連接不同的JMS提供者。這一組類首先使用一個連接工廠以連接到隊列或主題,然后發送或發布消息。在接收端,客戶接收或訂閱這些消息。.2.4.代碼演示apacheactivemqbinzipst<<transportConnectors><transportConnectorname="openwire"uri="tcp://localhost:61616"/><transportConnectorname="ssl"uri="ssl://localhost:61617"/><transportConnectorname="stomp"uri="stomp://localhost:61613"/><transportConnectoruri="http://localhost:8081"/><transportConnectoruri="udp://localhost:61618"/>apacheactivemqbinactivemqbatActiveMQ程序。3.運行代碼括:ApacheActiveMQJBoss社區所研發的HornetQJoramGroupOpenJMS括:temsQ.1.java監控工具使用.1.1.jconsolejconsole是一種集成了上面所有命令功能的可視化工具,可以分析jvm的內存使用情況JDKbinjconsoleexeJconsole所有虛擬機進程,不需要用戶使用jps來查詢了,雙擊其中一個進程即可開始監控。也可以“遠程連接服務器,進行遠程虛擬機的監控。”概述頁面顯示的是整個虛擬機主要運行數據的概覽。.1.2.jvisualvmjconsole能類似,提供了一大堆的插件。.2.java內存模型.2.1.內存模型圖解Java虛擬機在執行Java程序的過程中,會把它所管理的內存劃分為若干個不同的數據如下圖是一個內存模型的關系圖(詳情見圖:內存劃分.png):如上圖所示,Java虛擬機運行時數據區域被分為五個區域:堆(Heap)、棧(Stack)、本地方法棧(NativeStack)、方法區(MethodArea)、程序計數器(ProgramCountRegister)。.2.2.堆(Heap)JavaHeapJava域隨著聽說線程安全的問題,就會很明確的知道JavaHeap是一塊共享的區域,操作共享區域的成與JavaHeap相關的還有Java的垃圾回收機制(GC),JavaHeap是垃圾回收器管理的主要區域。程序猿所熟悉的新生代、老生代、永久代的概念就是在堆里面,現在大多數的GC基本都采用了分代收集算法。如果再細致一點,JavaHeap還有Eden空間,FromSurvivor空ToSurvivor間等。JavaHeap可以處于物理上不連續的內存空間中,只要邏輯上是連續的即可。.2.3.棧(Stack)kJava模型,每個方法執行時都會創建一個棧幀(StackFrame)用語存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。從下圖從可以看到,每個線程在執行一個方法時,都意味著有一個棧幀在當前線程對應的棧幀中入棧和出棧。圖中可以看到每一個棧幀中都有局部變量表。局部變量表存放了編譯期間的各種基本數據類.2.4.本地方法棧(NativeStack)本地方法棧(NativeStack)與Java虛擬機站(JavaStack)所發揮的作用非常相似,他們之間的區別在于虛擬機棧為虛擬機棧執行java方法(也就是字節碼)服務,而本地方法e.2.5.方法區(MethodArea)方法區(MethodArea)與堆(JavaHeap)一樣,是各個線程共享的內存區域,它用于存儲虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。雖然Javap分析下Java虛擬機規范,之所以把方法區描述為堆的一個邏輯部分,應該覺得她們都是存儲數據的角度出發的。一個存儲對象數據(堆),一個存儲靜態信息(方法區)。在上文中,我們看到堆中有新生代、老生代、永久代的描述。為什么我們將新生代、老生代、永久代三個概念一起說,那是因為HotSpot虛擬機的設計團隊選擇把GC分代收集擴Java堆一樣管理這部分內存。簡單點說就是HotSpot虛擬機中內存模型的分代,其中新生代在永久代的字符串常量池移出。 Java虛擬機棧(JavaStack)本地方法棧(NativeStack)堆(JavaHeap)方法區.3.GC算法.3.1.標記-清除算法(Mark-Sweep)1、標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象2、在標記完成后統一回收所有被標記的對象缺點:一個是效率問題,標記和清除兩個過程的效率都不高;另一個是空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。.3.2.復制算法(Copying)每次只使用其中的一塊。2、當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。優點:這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。只是這種算法的代價是將內存縮小為缺點:復制收集算法在對象存活率較高時就要進行較多的復制操作,效率將會變低.3.3.標記-整理算法(Mark-Compact)2、讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存.3.4.分代收集算法(GenerationalCollection)3、在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。4、老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記—清理”或者“標記—整理”算法來進行回收。.4.垃圾回收器.4.1.Serial收集器:1、是一個單線程的收集器,“StopTheWorld”Client式下的虛擬機來說是一個很好的選擇4、簡單而高效.4.2.SerialOld收集器.4.3.ParNew收集器4、使用-XX:+UseConcMarkSweepGC選項后的默認新生代收集器,也可以使用-XX:.4.4.ParallelScavenge收集器集器2、新生代收集器,復制算法,并行的多線程收集器3、目標是達到一個可控制的吞吐量(Throughput)。4、吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),虛擬機總共運行了5、兩個參數用于精確控制吞吐量:XXMaxGCPauseMillisr代對象年齡6、并行(Parallel):指多條垃圾收集線程并行工作,但此時用戶線程仍然處于等待狀態。7、并發(Concurrent):指用戶線程與垃圾收集線程同時執行(但不一定是并行的,可能會交替執行),用戶CMS收集器一款優秀的收集器1、以獲取最短回收停頓時間為目標的收集器。站或者B/S系統的服務端上,重視服務的響應速度,希望系統停頓時間最短的應用3、基于“標記—清除”算法實現的CMS器的內存回收過程是與用戶線程一起并發執行的標記產生變動的那一部分對象的標記記錄,但遠比并發標記的時間短6、優點:并發收集、低停頓一款基于“標記—清除”算法實現的收集器1、當今收集器技術發展的最前沿成果之一存空間碎片可預測的停頓:能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃GCRoot達性分析,找出存活的對象,這階段耗時較長,但可與用戶程序并發執行最終標記:修正在并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分標記記錄時間來制定回收計劃垃圾收集器參數總結-XX:+UseSerialGC:年輕串行(Serial),老年串行(SerialOld)-XX:+UseParNewGC:年輕并行(ParNew),老年串行(SerialOld)-XX:+UseConcMarkSweepGC:年輕并行(ParNew),老年串行(CMS),備份(SerialOld)-XX:+UseParallelGC:年輕并行吞吐(ParallelScavenge),老年串行(SerialOld)-XX:+UseParalledlOldGC:年輕并行吞吐(ParallelScavenge),老年并行吞吐(ParallelOld)U.5.JVM參數列表javajava-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:NewRatio=4-XX:SurvivorRatio=4-XX:MaxPermSize=16m-XX:MaxTenuringThreshold=0XmxmM。Xmsm50m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。gG整個堆大小=年輕代大小+年老代大小+持久代大小。持久代一般固定大小為64m,所以對系統性能影響較大,Sun官方推薦配置為整個-Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。XXNewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。urvivorvorXX:MaxPermSize=16m:設置持久代大小為16m。-XX:MaxTenuringThreshold=15:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。收集器設置-XX:+UseSerialGC:設置串行收集器-XX:+UseParallelGC:設置并行收集器-XX:+UseParalledlOldGC:設置并行年老代收集器-XX:+UseConcMarkSweepGC:設置并發收集器垃圾回收統計信息-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:filename并行收集器設置-XX:ParallelGCThreads=n:設置并行收集器收集時使用的CPU數。并行收集線程數。-XX:MaxGCPauseMillis=n:設置并行收集最大暫停時間-XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)并發收集器設置-XX:+CMSIncrementalMode:設置為增量模式。適用于單CPU情況。-XX:ParallelGCThreads=n:設置并發收集器年輕代收集方式為并行收集時,使用的CPU數。并.6.jvm案例演示內存標簽相當于可視化的jstat命令,用于監視收集器管理的虛擬機內存(java堆和永久代)的變化趨勢。我們通過下面的一段代碼體驗一下它的監視功能。運行時設置的虛擬機參數為:存中填充數據。publicpublicclassTestMemory{staticclassOOMObject{publicbyte[]placeholder=newbyte[64*1024];}publicstaticvoidfillHeap(intnum)throwsException{ArrayList<OOMObject>list=newArrayList<OOMObject>();for(inti=0;i<num;i++){Thread.sleep(50);list.add(newOOMObject());}System.gc();}publicstaticvoidmain(String[]args)throwsException{fillHeap(1000);Thread.sleep(500000);}}區都基本上被清空了,但是老年代仍然保持峰值狀態,這說明,填充的數據在GC后仍然存活,因為list的作用域沒有結束。如果把System.gc();移到fillHeap(1000);后,就可以全部回線程相當于可視化了jstack命令,遇到線程停頓時,可以使用這個也簽進行監控分析。線程長時間停頓的主要原因有:等待外部資源(數據庫連接等),死循環、鎖等待。下面的代碼packagecnjava.jvm;importjavaioBufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;lassTestThread/***死循環演示*argspublicstaticvoidcreateBusyThread(){Threadthread=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("createBusyThread");while(true);}testBusyThread");thread.start();}/***線程鎖等待*argspublicstaticvoidcreateLockThread(finalObjectlock){Threadthread=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("createLockThread");synchronized(lock){try{}catch(InterruptedExceptione){intStackTrace}}}},"testLockThread");thread.start();}publicstaticvoidmain(String[]args)throwsException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));createBusyThreadObjectobject=newObject();createLockThread(object);}}main線程:追蹤到需要鍵盤錄入testBusyThread線程:線程阻塞在18行的while(true),直到線程切換,很耗性能packagepackagecnjava.jvm;publicclassTestDeadThreadimplementsRunnable{intab;publicTestDeadThread(inta,intb){this.a=a;this.b=b;}@Overridepublicvoidrun(){System.out.println("createDeadThread");ueOfaeOfbSystem.out.println(a+b);}}}publicstaticvoidmain(String[]args){forfor(inti=0;i<100;i++){newThread(newTestDeadThread(1,2)).start();newThread(newTestDeadThread(2,1)).start();}}}點擊檢查死鎖,會出現死鎖的詳情。threadthread持有,相反亦是,造成死鎖。.7.java動態代理、反射.7.1.反射通過反射的方式可以獲取class對象中的屬性、方法、構造函數等,一下是實例:ackagecnjavareflectimportjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;importorg.junit.Before;tpublicclassMyReflect{publicStringclassName=null;@SuppressWarnings("rawtypes")publicClasspersonClass=null;/***@throwsException@Beforepublicvoidinit()throwsException{className="cn.java.reflect.Person";personClass=Class.forName(className);}/**publicvoidgetClassName()throwsException{System.out.println(personClass);}/**class對象的另一種方式publicvoidgetClassName2()throwsException{System.out.println(Person.class);}/***創建一個class文件表示的真實對象,底層會調用空參數的構造方法publicvoidgetNewInstance()throwsException{System.out.println(personClass.newInstance());}/***獲取非私有的構造函數@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetPublicConstructor()throwsException{Constructorconstructor=personClass.getConstructor(Long.class,String.class);Personperson=(Person)constructor.newInstance(100L,"zhangsan");System.out.println(person.getId());System.out.println(person.getName());}/***獲得私有的構造函數@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetPrivateConstructor()throwsException{Constructorcon=personClass.getDeclaredConstructor(String.class);con.setAccessible(true);//強制取消Java的權限檢測Personperson2=(Person)con.newInstance("zhangsan");System.out.println(person2.getName());}/***獲取非私有的成員變量@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetNotPrivateField()throwsException{Constructorconstructor=personClass.getConstructor(Long.class,String.class);Objectobj=constructor.newInstance(100L,"zhangsan");Fieldfield=personClass.getField("name");field.set(obj,"lisi");System.out.println(field.get(obj));}/***獲取私有的成員變量@SuppressWarnings({"rawtypes","unchecked"})publicvoidgetPrivateField()throwsException{Constructorconstructor=personClass.getConstructor(Long.class);Objectobj=constructor.newInstance(100L);Fieldfield2=personClass.getDeclaredField("id");field2.setAccessible(true);//強制取消Java的權限檢測field2.set(obj,10000L);System.out.println(field2.get(obj));}/***獲取非私有的成員函數@SuppressWarnings({"unchecked"})publicvoidgetNotPrivateMethod()throwsException{System.out.println(personClass.getMethod("toString"));Objectobj=personClass.newInstance();//獲取空參的構造函數Objectobject=personClass.getMethod("toString").invoke(obj);System.out.println(object);}/***獲取私有的成員函數@SuppressWarnings("unchecked")publicvoidgetPrivateMethod()throwsException{Objectobj=personClass.newInstance();//獲取空參的構造函數Methodmethod=personClass.getDeclaredMethod("getSomeThing");method.setAccessible(true);Objectvalue=method.invoke(obj);System.out.println(value);}/***publicvoidotherMethod()throwsException{//當前加載這個class文件的那個類加載器對象System.out.println(personClass.getClassLoader());//獲取某個類實現的所有接口Class[]interfaces=personClass.getInterfaces();for(Classclass1:interfaces){System.out.println(class1);}//反射當前這個類的直接父類System.out.println(personClass.getGenericSuperclass());/***getResourceAsStream這個方法可以獲取到一個輸入流,這個輸入流會關聯到name所表示的那個文件上。path對路徑,最終還是由ClassLoader獲取資源。System.out.println(personClass.getResourceAsStream("/perties"));//默認則是從ClassPath根下獲取,path不能以’/'開頭,最終是由ClassLoader獲System.out.println(personClass.getResourceAsStream("/perties"));//判斷當前的Class對象表示是否是數組System.out.println(personClass.isArray());System.out.println(newString[3].getClass().isArray());//判斷當前的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 血液系統疾病的護理
- 節能電池考試題及答案
- 江蘇保安考試題及答案
- 沙漠壓力測試題及答案
- EMC布線考試題及答案
- 林草局遴選試題及答案
- 弱電安防面試題及答案
- 2025年隔膜電解裝置項目申請報告模板
- 低碳城市規劃與城市綠色建筑運營維護實踐案例分析報告
- 2025年在線教育平臺用戶滿意度提升策略與商業模式創新報告
- 2023年黑龍江省文化和旅游系統事業單位人員招聘筆試模擬試題及答案解析
- 2023年江西新余市數字產業投資發展有限公司招聘筆試題庫含答案解析
- LY/T 3323-2022草原生態修復技術規程
- 部編版六年級語文下冊課件第1課《北京的春節》《臘八粥》
- 涂裝工模擬練習題含答案
- 2023-2024學年河南省永城市小學數學二年級下冊期末評估測試題
- 乳腺疾病的超聲診斷 (超聲科)
- 服務精神:馬里奧特之路
- 《建筑施工安全檢查標準》JGJ59-2011圖解
- 華為大學人才培養與發展實踐
- 醫療垃圾廢物處理課件
評論
0/150
提交評論