亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入解析JVM對(duì)dll文件和對(duì)類(lèi)的裝載過(guò)程

 更新時(shí)間:2015年11月20日 15:33:18   作者:80197675  
這篇文章主要介紹了JVM對(duì)dll文件的裝載和對(duì)類(lèi)的裝載過(guò)程,針對(duì)Java在Windows下的一些運(yùn)行情況作出講解,需要的朋友可以參考下

JVM的對(duì)dll文件的裝載過(guò)程

操作系統(tǒng)裝入JVM是通過(guò)jdk中Java.exe來(lái)完成,通過(guò)下面4步來(lái)完成JVM環(huán)境.

1.創(chuàng)建JVM裝載環(huán)境和配置

2.裝載JVM.dll

3.初始化JVM.dll并掛界到JNIENV(JNI調(diào)用接口)實(shí)例

4.調(diào)用JNIEnv實(shí)例裝載并處理class類(lèi)。

一.JVM裝入環(huán)境,JVM提供的方式是操作系統(tǒng)的動(dòng)態(tài)連接文件.
    既然是文件那就一個(gè)裝入路徑的問(wèn)題,Java是怎么找這個(gè)路徑的呢?當(dāng)你在調(diào)用Java test的時(shí)候,操作系統(tǒng)會(huì)在path下在你的Java.exe程序,Java.exe就通過(guò)下面一個(gè)過(guò)程來(lái)確定JVM的路徑和相關(guān)的參數(shù)配置了.下面基于Windows的實(shí)現(xiàn)的分析.

    首先查找jre路徑,Java是通過(guò)GetApplicationHome api【該方法存在于java_md.c】來(lái)獲得當(dāng)前的Java.exe絕對(duì)路徑。
    例如 c:\j2sdk1.4.2_09\bin\Java.exe,那么它會(huì)截取到絕對(duì)路徑c:\j2sdk1.4.2_09\,判斷c:\j2sdk1.4.2_09\bin\Java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作為jre路徑,如果不存在則判斷c:\j2sdk1.4.2_09\jre\bin\Java.dll是否存在,如果存在這c:\j2sdk1.4.2_09\jre作為jre路徑.如果不存在調(diào)用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“當(dāng)前JRE版本號(hào)”\JavaHome的路徑為jre路徑。
   備注獲取當(dāng)前jre路徑的方法為System.out.println(System.getProperty("java.home"));

   然后裝載JVM.cfg文件JRE路徑+\lib+\ARCH(CPU構(gòu)架)+\JVM.cfgARCH(CPU構(gòu)架)的判斷是通過(guò)Java_md.c中GetArch函數(shù)判斷的,該函數(shù)中windows平臺(tái)只有兩種情況:WIN64的‘ia64',其他情況都為‘i386'。以我的為例:C:\j2sdk1.4.2_09\jre\lib\i386\JVM.cfg.主要的內(nèi)容如下: 

  •   -client KNOWN  
  •   -server KNOWN 
  •   -hotspot ALIASED_TO -client  
  •   -classic WARN
  •   -native ERROR
  •   -green ERROR  

  在我們的jdk目錄中jre\bin\server和jre\bin\client都有JVM.dll文件存在,而Java正是通過(guò)JVM.cfg配置文件來(lái)管理這些不同版本的JVM.dll的.通過(guò)文件我們可以定義目前jdk中支持那些JVM,前面部分(client)是JVM名稱(chēng),后面是參數(shù),KNOWN表示JVM存在,ALIASED_TO表示給別的JVM取一個(gè)別名,WARN表示不存在時(shí)找一個(gè)JVM替代,ERROR表示不存在拋出異常.

  在運(yùn)行Java XXX是,Java.exe會(huì)通過(guò)CheckJVMType來(lái)檢查當(dāng)前的JVM類(lèi)型,Java可以通過(guò)兩種方式來(lái)指定具體的JVM類(lèi)型,
  第一種按照J(rèn)VM.cfg文件中的JVM名稱(chēng)指定。
  第二種方法是直接指定,它們執(zhí)行的方法分別是“Java -J”、“Java -XXaltJVM=”或“Java -J-XXaltJVM=”。
  如果是第一種參數(shù)傳遞方式,CheckJVMType函數(shù)會(huì)取參數(shù)‘-J'后面的JVM名稱(chēng),然后從已知的JVM配置參數(shù)中查找如果找到同名的則去掉該JVM名稱(chēng)前的‘-'直接返回該值;
  而第二種方法,會(huì)直接返回“-XXaltJVM=”或“-J-XXaltJVM=”后面的JVM類(lèi)型名稱(chēng);如果在運(yùn)行Java時(shí)未指定上面兩種方法中的任一一種參數(shù),CheckJVMType會(huì)取配置文件中第一個(gè)配置中的JVM名稱(chēng),去掉名稱(chēng)前面的‘-'返回該值。CheckJVMType函數(shù)的這個(gè)返回值會(huì)在下面的函數(shù)中匯同jre路徑組合成JVM.dll的絕對(duì)路徑。
  如果沒(méi)有指定這會(huì)使用JVM.cfg中第一個(gè)定義的JVM.可以通過(guò)set _Java_LAUNCHER_DEBUG=1在控制臺(tái)上測(cè)試.

  最后獲得JVM.dll的路徑,JRE路徑+\bin+\JVM類(lèi)型字符串+\JVM.dll就是JVM的文件路徑了,但是如果在調(diào)用Java程序時(shí)用-XXaltJVM=參數(shù)指定的路徑path,就直接用path+\JVM.dll文件做為JVM.dll的文件路徑.

二:裝載JVM.dll

    通過(guò)第一步已經(jīng)找到了JVM的路徑,Java通過(guò)LoadJavaVM來(lái)裝入JVM.dll文件.裝入工作很簡(jiǎn)單就是調(diào)用Windows API函數(shù):

    LoadLibrary裝載JVM.dll動(dòng)態(tài)連接庫(kù).然后把JVM.dll中的導(dǎo)出函數(shù)JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs掛接到   InvocationFunctions變量的CreateJavaVM和GetDefaultJavaVMInitArgs函數(shù)指針變量上。JVM.dll的裝載工作宣告完成。

三:初始化JVM,獲得本地調(diào)用接口
      這樣就可以在Java中調(diào)用JVM的函數(shù)了.調(diào)用InvocationFunctions->CreateJavaVM也就是JVM中   JNI_CreateJavaVM方法獲得JNIEnv結(jié)構(gòu)的實(shí)例.

四:運(yùn)行Java程序.

    Java程序有兩種方式一種是jar包,一種是class. 運(yùn)行jar,Java -jar XXX.jar運(yùn)行的時(shí)候,Java.exe調(diào)用GetMainClassName函數(shù),該函數(shù)先獲得JNIEnv實(shí)例然后調(diào)用Java類(lèi)Java.util.jar.JarFileJNIEnv中方法getManifest()并從返回的Manifest對(duì)象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主類(lèi)名作為運(yùn)行的主類(lèi)。之后main函數(shù)會(huì)調(diào)用Java.c中LoadClass方法裝載該主類(lèi)(使用JNIEnv實(shí)例的FindClass)。main函數(shù)直接調(diào)用Java.c中LoadClass方法裝載該類(lèi)。如果是執(zhí)行class方法。main函數(shù)直接調(diào)用Java.c中LoadClass方法裝載該類(lèi)。

    然后main函數(shù)調(diào)用JNIEnv實(shí)例的GetStaticMethodID方法查找裝載的class主類(lèi)中?!皃ublic static void main(String[] args)”方法,并判斷該方法是否為public方法,然后調(diào)用JNIEnv實(shí)例的 CallStaticVoidMethod方法調(diào)用該Java類(lèi)的main方法。

JVM的類(lèi)裝載
一、引言
      Java虛擬機(jī)(JVM)的類(lèi)裝載就是指將包含在類(lèi)文件中的字節(jié)碼裝載到JVM中, 并使其成為JVM一部分的過(guò)程。JVM的類(lèi)動(dòng)態(tài)裝載技術(shù)能夠在運(yùn)行時(shí)刻動(dòng)態(tài)地加載或者替換系統(tǒng)的某些功能模塊, 而不影響系統(tǒng)其他功能模塊的正常運(yùn)行。本文將分析JVM中的類(lèi)裝載系統(tǒng),探討JVM中類(lèi)裝載的原理、實(shí)現(xiàn)以及應(yīng)用。
二、Java虛擬機(jī)的類(lèi)裝載實(shí)現(xiàn)與應(yīng)用
2.1  裝載過(guò)程簡(jiǎn)介
       所謂裝載就是尋找一個(gè)類(lèi)或是一個(gè)接口的二進(jìn)制形式并用該二進(jìn)制形式來(lái)構(gòu)造代表這個(gè)類(lèi)或是這個(gè)接口的class對(duì)象的過(guò)程,其中類(lèi)或接口的名稱(chēng)是給定了的。當(dāng)然名稱(chēng)也可以通過(guò)計(jì)算得到,但是更常見(jiàn)的是通過(guò)搜索源代碼經(jīng)過(guò)編譯器編譯后所得到的二進(jìn)制形式來(lái)構(gòu)造。
      在Java中,類(lèi)裝載器把一個(gè)類(lèi)裝入Java虛擬機(jī)中,要經(jīng)過(guò)三個(gè)步驟來(lái)完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗(yàn)、準(zhǔn)備和解析三步,除了解析外,其它步驟是嚴(yán)格按照順序完成的,各個(gè)步驟的主要工作如下:

  •       裝載:查找和導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù);
  •       鏈接:執(zhí)行下面的校驗(yàn)、準(zhǔn)備和解析步驟,其中解析步驟是可以選擇的;
  •       校驗(yàn):檢查導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù)的正確性;
  •       準(zhǔn)備:給類(lèi)的靜態(tài)變量分配并初始化存儲(chǔ)空間;
  •       解析:將符號(hào)引用轉(zhuǎn)成直接引用;
  •       初始化:激活類(lèi)的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊。

2.2  裝載的實(shí)現(xiàn)

     JVM中類(lèi)的裝載是由ClassLoader和它的子類(lèi)來(lái)實(shí)現(xiàn)的,Java ClassLoader 是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類(lèi)文件的類(lèi)。
     在Java中,ClassLoader是一個(gè)抽象類(lèi),它在包java.lang中,可以這樣說(shuō),只要了解了在ClassLoader中的一些重要的方法,再結(jié)合上面所介紹的JVM中類(lèi)裝載的具體的過(guò)程,對(duì)動(dòng)態(tài)裝載類(lèi)這項(xiàng)技術(shù)就有了一個(gè)比較大概的掌握,這些重要的方法包括以下幾個(gè):
     ①loadCass方法  loadClass(String name ,boolean resolve)其中name參數(shù)指定了JVM需要的類(lèi)的名稱(chēng),該名稱(chēng)以包表示法表示,如Java.lang.Object;resolve參數(shù)告訴方法是否需要解析類(lèi),在初始化類(lèi)之前,應(yīng)考慮類(lèi)解析,并不是所有的類(lèi)都需要解析,如果JVM只需要知道該類(lèi)是否存在或找出該類(lèi)的超類(lèi),那么就不需要解析。這個(gè)方法是ClassLoader 的入口點(diǎn)。
     ②defineClass方法  這個(gè)方法接受類(lèi)文件的字節(jié)數(shù)組并把它轉(zhuǎn)換成Class對(duì)象。字節(jié)數(shù)組可以是從本地文件系統(tǒng)或網(wǎng)絡(luò)裝入的數(shù)據(jù)。它把字節(jié)碼分析成運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)、校驗(yàn)有效性等等。
     ③findSystemClass方法  findSystemClass方法從本地文件系統(tǒng)裝入文件。它在本地文件系統(tǒng)中尋找類(lèi)文件,如果存在,就使用defineClass將字節(jié)數(shù)組轉(zhuǎn)換成 Class對(duì)象,以將該文件轉(zhuǎn)換成類(lèi)。當(dāng)運(yùn)行Java應(yīng)用程序時(shí),這是JVM 正常裝入類(lèi)的缺省機(jī)制。
     ④resolveClass方法  resolveClass(Class c)方法解析裝入的類(lèi),如果該類(lèi)已經(jīng)被解析過(guò)那么將不做處理。當(dāng)調(diào)用loadClass方法時(shí),通過(guò)它的resolve 參數(shù)決定是否要進(jìn)行解析。
     ⑤findLoadedClass方法  當(dāng)調(diào)用loadClass方法裝入類(lèi)時(shí),調(diào)用findLoadedClass 方法來(lái)查看ClassLoader是否已裝入這個(gè)類(lèi),如果已裝入,那么返回Class對(duì)象,否則返回NULL。如果強(qiáng)行裝載已存在的類(lèi),將會(huì)拋出鏈接錯(cuò)誤。
2.3  裝載的應(yīng)用
      一般來(lái)說(shuō),我們使用虛擬機(jī)的類(lèi)裝載時(shí)需要繼承抽象類(lèi)java.lang.ClassLoader,其中必須實(shí)現(xiàn)的方法是loadClass(),對(duì)于這個(gè)方法需要實(shí)現(xiàn)如下操作:(1) 確認(rèn)類(lèi)的名稱(chēng);(2) 檢查請(qǐng)求要裝載的類(lèi)是否已經(jīng)被裝載;(3) 檢查請(qǐng)求加載的類(lèi)是否是系統(tǒng)類(lèi);(4) 嘗試從類(lèi)裝載器的存儲(chǔ)區(qū)獲取所請(qǐng)求的類(lèi);(5) 在虛擬機(jī)中定義所請(qǐng)求的類(lèi);(6) 解析所請(qǐng)求的類(lèi);(7) 返回所請(qǐng)求的類(lèi)。
      所有的Java 虛擬機(jī)都包括一個(gè)內(nèi)置的類(lèi)裝載器,這個(gè)內(nèi)置的類(lèi)庫(kù)裝載器被稱(chēng)為根裝載器(bootstrap ClassLoader)。根裝載器的特殊之處是它只能夠裝載在設(shè)計(jì)時(shí)刻已知的類(lèi),因此虛擬機(jī)假定由根裝載器所裝載的類(lèi)都是安全的、可信任的,可以不經(jīng)過(guò)安全認(rèn)證而直接運(yùn)行。當(dāng)應(yīng)用程序需要加載并不是設(shè)計(jì)時(shí)就知道的類(lèi)時(shí),必須使用用戶自定義的裝載器(user-defined ClassLoader)。下面我們舉例說(shuō)明它的應(yīng)用。

public abstract class MultiClassLoader extends ClassLoader{ 
  ... 
  public synchronized Class loadClass(String s, boolean flag) 
    throws ClassNotFoundException 
  { 
    /* 檢查類(lèi)s是否已經(jīng)在本地內(nèi)存*/ 
    Class class1 = (Class)classes.get(s); 
 
/* 類(lèi)s已經(jīng)在本地內(nèi)存*/ 
    if(class1 != null) return class1;  
    try/*用默認(rèn)的ClassLoader 裝入類(lèi)*/ { 
      class1 = super.findSystemClass(s); 
      return class1; 
    } 
    catch(ClassNotFoundException _ex) { 
      System.out.println(">> Not a system class."); 
    } 
 
/* 取得類(lèi)s的字節(jié)數(shù)組*/ 
    byte abyte0[] = loadClassBytes(s); 
    if(abyte0 == null)  throw new ClassNotFoundException(); 
 
/* 將類(lèi)字節(jié)數(shù)組轉(zhuǎn)換為類(lèi)*/ 
    class1 = defineClass(null, abyte0, 0, abyte0.length); 
    if(class1 == null) throw new ClassFormatError(); 
    if(flag)  resolveClass(class1); /*解析類(lèi)*/ 
 
/* 將新加載的類(lèi)放入本地內(nèi)存*/ 
    classes.put(s, class1); 
    System.out.println(">> Returning newly loaded class."); 
 
/* 返回已裝載、解析的類(lèi)*/ 
    return class1; 
  } 
  ... 
} 

 
三、Java虛擬機(jī)的類(lèi)裝載原理
       前面我們已經(jīng)知道,一個(gè)Java應(yīng)用程序使用兩種類(lèi)型的類(lèi)裝載器:根裝載器(bootstrap)和用戶定義的裝載器(user- defined)。根裝載器是Java虛擬機(jī)實(shí)現(xiàn)的一部分,舉個(gè)例子來(lái)說(shuō),如果一個(gè)Java虛擬機(jī)是在現(xiàn)在已經(jīng)存在并且正在被使用的操作系統(tǒng)的頂部用C程序來(lái)實(shí)現(xiàn)的,那么根裝載器將是那些C程序的一部分。根裝載器以某種默認(rèn)的方式將類(lèi)裝入,包括那些Java API的類(lèi)。在運(yùn)行期間一個(gè)Java程序能安裝用戶自己定義的類(lèi)裝載器。根裝載器是虛擬機(jī)固有的一部分,而用戶定義的類(lèi)裝載器則不是,它是用Java語(yǔ)言寫(xiě)的,被編譯成class文件之后然后再被裝入到虛擬機(jī),并像其它的任何對(duì)象一樣可以被實(shí)例化。 Java類(lèi)裝載器的體系結(jié)構(gòu)如下所示:
20151120153002768.gif (534×320)

圖1  Java的類(lèi)裝載的體系結(jié)構(gòu)
      Java的類(lèi)裝載模型是一種代理(delegation)模型。當(dāng)JVM 要求類(lèi)裝載器CL(ClassLoader)裝載一個(gè)類(lèi)時(shí),CL首先將這個(gè)類(lèi)裝載請(qǐng)求轉(zhuǎn)發(fā)給他的父裝載器。只有當(dāng)父裝載器沒(méi)有裝載并無(wú)法裝載這個(gè)類(lèi)時(shí),CL才獲得裝載這個(gè)類(lèi)的機(jī)會(huì)。這樣, 所有類(lèi)裝載器的代理關(guān)系構(gòu)成了一種樹(shù)狀的關(guān)系。樹(shù)的根是類(lèi)的根裝載器(bootstrap ClassLoader) , 在JVM 中它以"null"表示。除根裝載器以外的類(lèi)裝載器有且僅有一個(gè)父裝載器。在創(chuàng)建一個(gè)裝載器時(shí), 如果沒(méi)有顯式地給出父裝載器, 那么JVM將默認(rèn)系統(tǒng)裝載器為其父裝載器。Java的基本類(lèi)裝載器代理結(jié)構(gòu)如圖2所示:

20151120153026615.gif (442×198)

圖2  Java類(lèi)裝載的代理結(jié)構(gòu)
下面針對(duì)各種類(lèi)裝載器分別進(jìn)行詳細(xì)的說(shuō)明。
      根(Bootstrap) 裝載器:該裝載器沒(méi)有父裝載器,它是JVM實(shí)現(xiàn)的一部分,從sun.boot.class.path裝載運(yùn)行時(shí)庫(kù)的核心代碼。
      擴(kuò)展(Extension) 裝載器:繼承的父裝載器為根裝載器,不像根裝載器可能與運(yùn)行時(shí)的操作系統(tǒng)有關(guān),這個(gè)類(lèi)裝載器是用純Java代碼實(shí)現(xiàn)的,它從java.ext.dirs (擴(kuò)展目錄)中裝載代碼。
      系統(tǒng)(System or Application) 裝載器:裝載器為擴(kuò)展裝載器,我們都知道在安裝JDK的時(shí)候要設(shè)置環(huán)境變量(CLASSPATH ),這個(gè)類(lèi)裝載器就是從java.class.path(CLASSPATH 環(huán)境變量)中裝載代碼的,它也是用純Java代碼實(shí)現(xiàn)的,同時(shí)還是用戶自定義類(lèi)裝載器的缺省父裝載器。
      小應(yīng)用程序(Applet) 裝載器: 裝載器為系統(tǒng)裝載器,它從用戶指定的網(wǎng)絡(luò)上的特定目錄裝載小應(yīng)用程序代碼。
在設(shè)計(jì)一個(gè)類(lèi)裝載器的時(shí)候,應(yīng)該滿足以下兩個(gè)條件:
     對(duì)于相同的類(lèi)名,類(lèi)裝載器所返回的對(duì)象應(yīng)該是同一個(gè)類(lèi)對(duì)象
     如果類(lèi)裝載器CL1將裝載類(lèi)C的請(qǐng)求轉(zhuǎn)給類(lèi)裝載器CL2,那么對(duì)于以下的類(lèi)或接口,CL1和CL2應(yīng)該返回同一個(gè)類(lèi)對(duì)象:a)S為C的直接超類(lèi);b)S為C的直接超接口;c)S為C的成員變量的類(lèi)型;d)S為C的成員方法或構(gòu)建器的參數(shù)類(lèi)型;e)S為C的成員方法的返回類(lèi)型。
      每個(gè)已經(jīng)裝載到JVM中的類(lèi)都隱式含有裝載它的類(lèi)裝載器的信息。類(lèi)方法getClassLoader 可以得到裝載這個(gè)類(lèi)的類(lèi)裝載器。一個(gè)類(lèi)裝載器認(rèn)識(shí)的類(lèi)包括它的父裝載器認(rèn)識(shí)的類(lèi)和它自己裝載的類(lèi),可見(jiàn)類(lèi)裝載器認(rèn)識(shí)的類(lèi)是它自己裝載的類(lèi)的超集。注意我們可以得到類(lèi)裝載器的有關(guān)的信息,但是已經(jīng)裝載到JVM中的類(lèi)是不能更改它的類(lèi)裝載器的。
Java中的類(lèi)的裝載過(guò)程也就是代理裝載的過(guò)程。比如:Web瀏覽器中的JVM需要裝載一個(gè)小應(yīng)用程序TestApplet。JVM調(diào)用小應(yīng)用程序裝載器ACL(Applet ClassLoader)來(lái)完成裝載。ACL首先請(qǐng)求它的父裝載器, 即系統(tǒng)裝載器裝載TestApplet是否裝載了這個(gè)類(lèi), 由于TestApplet不在系統(tǒng)裝載器的裝載路徑中, 所以系統(tǒng)裝載器沒(méi)有找到這個(gè)類(lèi), 也就沒(méi)有裝載成功。接著ACL自己裝載TestApplet。ACL通過(guò)網(wǎng)絡(luò)成功地找到了TestApplet.class 文件并將它導(dǎo)入到了JVM中。在裝載過(guò)程中, JVM發(fā)現(xiàn)TestAppet是從超類(lèi)java.applet.Applet繼承的。所以JVM再次調(diào)用ACL來(lái)裝載 java.applet.Applet類(lèi)。ACL又再次按上面的順序裝載Applet類(lèi), 結(jié)果ACL發(fā)現(xiàn)他的父裝載器已經(jīng)裝載了這個(gè)類(lèi), 所以ACL就直接將這個(gè)已經(jīng)裝載的類(lèi)返回給了JVM , 完成了Applet類(lèi)的裝載。接下來(lái),Applet類(lèi)的超類(lèi)也一樣處理。最后, TestApplet及所有有關(guān)的類(lèi)都裝載到了JVM中。
四、結(jié)論
      類(lèi)的動(dòng)態(tài)裝載機(jī)制是JVM的一項(xiàng)核心技術(shù), 也是容易被忽視而引起很多誤解的地方。本文介紹了JVM中類(lèi)裝載的原理、實(shí)現(xiàn)以及應(yīng)用,尤其分析了ClassLoader的結(jié)構(gòu)、用途以及如何利用自定義的ClassLoader裝載并執(zhí)行Java類(lèi),希望能使讀者對(duì)JVM中的類(lèi)裝載有一個(gè)比較深入的理解。

相關(guān)文章

  • java 線程池封裝及拒絕策略示例詳解

    java 線程池封裝及拒絕策略示例詳解

    這篇文章主要為大家介紹了java 線程池封裝及拒絕策略示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringMvc直接接收json數(shù)據(jù)自動(dòng)轉(zhuǎn)化為Map的實(shí)例

    SpringMvc直接接收json數(shù)據(jù)自動(dòng)轉(zhuǎn)化為Map的實(shí)例

    今天小編就為大家分享一篇SpringMvc直接接收json數(shù)據(jù)自動(dòng)轉(zhuǎn)化為Map的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 詳解Java的Spring框架中的注解的用法

    詳解Java的Spring框架中的注解的用法

    這篇文章主要介紹了Java的Spring框架中的注解的用法,包括對(duì)Java bean的定義的作用介紹,需要的朋友可以參考下
    2015-11-11
  • java多線程之Phaser的使用詳解

    java多線程之Phaser的使用詳解

    這篇文章主要介紹了java多線程之Phaser的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java實(shí)現(xiàn)簡(jiǎn)單員工管理系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單員工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單員工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring中Cache的使用方法詳解

    Spring中Cache的使用方法詳解

    這篇文章主要介紹了Spring中Cache的使用方法詳解,Spring Cache 是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,Spring Cache 提供了一層抽象,底層可以切換不同的緩存實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • BeanUtils.copyProperties復(fù)制不生效的解決

    BeanUtils.copyProperties復(fù)制不生效的解決

    這篇文章主要介紹了BeanUtils.copyProperties復(fù)制不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java使用Apache POI庫(kù)讀取Excel表格文檔的示例

    Java使用Apache POI庫(kù)讀取Excel表格文檔的示例

    POI庫(kù)是Apache提供的用于在Windows下讀寫(xiě)各類(lèi)微軟Office文檔的Java庫(kù),這里我們就來(lái)看一下Java使用Apache POI庫(kù)讀取Excel表格文檔的示例:
    2016-06-06
  • java面試突擊之sleep和wait有什么區(qū)別詳析

    java面試突擊之sleep和wait有什么區(qū)別詳析

    按理來(lái)說(shuō)sleep和wait本身就是八竿子打不著的兩個(gè)東西,但是在實(shí)際使用中大家都喜歡拿他們來(lái)做比較,或許是因?yàn)樗鼈兌伎梢宰尵€程處于阻塞狀態(tài),這篇文章主要給大家介紹了關(guān)于java面試突擊之sleep和wait有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • JDK1.8使用的垃圾回收器和執(zhí)行GC的時(shí)長(zhǎng)以及GC的頻率方式

    JDK1.8使用的垃圾回收器和執(zhí)行GC的時(shí)長(zhǎng)以及GC的頻率方式

    這篇文章主要介紹了JDK1.8使用的垃圾回收器和執(zhí)行GC的時(shí)長(zhǎng)以及GC的頻率方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評(píng)論