最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的類(lèi)加載器_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月16日 10:44:10   作者:zhangjg  
這篇文章主要為大家詳細(xì)介紹了Java中類(lèi)加載器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

從java的動(dòng)態(tài)性到類(lèi)加載機(jī)制 

Java是一種動(dòng)態(tài)語(yǔ)言。那么怎樣理解這個(gè)“動(dòng)態(tài)”呢?或者說(shuō)一門(mén)語(yǔ)言具備了什么特性,才能稱(chēng)之為動(dòng)態(tài)語(yǔ)言呢?對(duì)于java,我是這樣理解的。 

JVM(java虛擬機(jī))執(zhí)行的不是本地機(jī)器碼指令,而是執(zhí)行一種稱(chēng)之為字節(jié)碼的指令(存在于class文件中)。這就要求虛擬機(jī)在真正執(zhí)行字節(jié)碼之前,先把相關(guān)的class文件加載到內(nèi)存中。虛擬機(jī)不是一次性加載所有需要的class文件,因?yàn)樗趫?zhí)行的時(shí)候根本不會(huì)知道以后會(huì)用到哪些class文件。它是每用到一個(gè)類(lèi),就會(huì)在運(yùn)行時(shí)“動(dòng)態(tài)地”加載和這個(gè)類(lèi)相關(guān)的class文件。這就是java被稱(chēng)之為動(dòng)態(tài)性語(yǔ)言的根本原因。除了動(dòng)態(tài)加載類(lèi)之外,還會(huì)動(dòng)態(tài)的初始化類(lèi),對(duì)類(lèi)進(jìn)行動(dòng)態(tài)鏈接。動(dòng)態(tài)初始化和動(dòng)態(tài)鏈接放在其他文章中進(jìn)行介紹。本文中只關(guān)心類(lèi)的加載。 

在JVM中負(fù)責(zé)對(duì)類(lèi)進(jìn)行加載的正是本文要介紹的類(lèi)加載器(ClassLoader),所以,類(lèi)加載器是JVM不可或缺的重要組件。 

java中的類(lèi)加載器及類(lèi)加載器工作原理 

java中(指的是javase)有三種類(lèi)加載器。每個(gè)類(lèi)加載器在創(chuàng)建的時(shí)候已經(jīng)指定他們對(duì)應(yīng)的目錄, 也就是說(shuō)每個(gè)類(lèi)加載器去哪里加載類(lèi)是確定的,我認(rèn)為在ClassLoader類(lèi)中應(yīng)該會(huì)有g(shù)etTargetPath()之類(lèi)的方法, 得到他們對(duì)應(yīng)的路徑,找了找jdk的文檔,發(fā)現(xiàn)是沒(méi)有的。以下是這三種類(lèi)加載器和他們對(duì)應(yīng)的路徑: 

 * AppClassLoader  --   加載classpath指定的路徑中的類(lèi) 
 * ExtClassLoader   --   加載jre/lib/ext目錄下或者java.ext.dirs系統(tǒng)屬性定義的目錄下的類(lèi) 
 * BootStrap           --   加載JRE/lib/rt.jar中的類(lèi) 

那么類(lèi)加載器是如何工作的呢?可以參看jdk中ClassLoader類(lèi)的源碼。這個(gè)類(lèi)的實(shí)現(xiàn)使用了模板方法模式,首先是loadClass方法來(lái)加載類(lèi),loadClass方法又調(diào)用了findClass方法,該方法讀取并返回類(lèi)文件的數(shù)據(jù),findClass方法返回后,loadClass方法繼續(xù)調(diào)用defineClass方法,將返回的數(shù)據(jù)加工成虛擬機(jī)運(yùn)行時(shí)可識(shí)別的類(lèi)型信息。所以,我們?nèi)绻_(kāi)發(fā)自己的類(lèi)加載器,只需要繼承jdk中的ClassLoader類(lèi),并覆蓋findClass方法就可以了,剩下的而工作,父類(lèi)會(huì)完成。其他java平臺(tái)有的根據(jù)自己的需求,實(shí)現(xiàn)了自己特定的類(lèi)加載器,例如javaee平臺(tái)中的tomcat服務(wù)器,Android平臺(tái)中的dalvik虛擬機(jī)也定義了自己的類(lèi)加載器。 

虛擬機(jī)加載類(lèi)有兩種方式,一種方式就是上面提到的ClassLoader.loadClass()方法,另一種是使用反射API,Class.forName()方法,其實(shí)Class.forName()方法內(nèi)部也是使用的ClassLoader。Class類(lèi)中forName方法的實(shí)現(xiàn)如下: 

public static Class<?> forName(String name, boolean initialize,
  ClassLoader loader)
  throws ClassNotFoundException
 {
 if (loader == null) {
  SecurityManager sm = System.getSecurityManager();
  if (sm != null) {
 ClassLoader ccl = ClassLoader.getCallerClassLoader();
 if (ccl != null) {
  sm.checkPermission(
 SecurityConstants.GET_CLASSLOADER_PERMISSION);
 }
  }
 }
 return forName0(name, initialize, loader);
 }

 /** Called after security checks have been made. */
 private static native Class forName0(String name, boolean initialize,
   ClassLoader loader)
 throws ClassNotFoundException;
 

類(lèi)加載器的三個(gè)特性 

類(lèi)加載器有三個(gè)特性,分別為委派,可見(jiàn)性和單一性,其他文章上對(duì)這三個(gè)特性的介紹如下: 

  * 委托機(jī)制是指將加載一個(gè)類(lèi)的請(qǐng)求交給父類(lèi)加載器,如果這個(gè)父類(lèi)加載器不能夠找到或者加載這個(gè)類(lèi),那么再加載它。
  * 可見(jiàn)性的原理是子類(lèi)的加載器可以看見(jiàn)所有的父類(lèi)加載器加載的類(lèi),而父類(lèi)加載器看不到子類(lèi)加載器加載的類(lèi)。
  * 單一性原理是指僅加載一個(gè)類(lèi)一次,這是由委托機(jī)制確保子類(lèi)加載器不會(huì)再次加載父類(lèi)加載器加載過(guò)的類(lèi)。 

其中,委派機(jī)制是基礎(chǔ),在其他資料中也把這種機(jī)制叫做類(lèi)加載器的雙親委派模型,其實(shí)說(shuō)的是同一個(gè)意思??杉有院蛦我恍允且蕾?lài)于委派機(jī)制的。

以下代碼測(cè)試類(lèi)加載器的委派機(jī)制: 

 ClassLoader appClassLoader = ClassLoaderTest.class.getClassLoader();
 System.out.println(appClassLoader); //sun.misc.Launcher$AppClassLoader@19821f
 
 
 ClassLoader extClassLoader = appClassLoader.getParent();
 System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@addbf1
 //AppClassLoader的父加載器是ExtClassLoader
 
 System.out.println(extClassLoader.getParent()); //null
 //ExtClassLoader的父加載器是null, 也就是BootStrap,這是由c語(yǔ)言實(shí)現(xiàn)的

由打印結(jié)果可知,加載我們自己編寫(xiě)的類(lèi)的加載器是AppClassLoader,AppClassLoader的父加載器是ExtClassLoader,在而ExtClassLoader的父加載器返回結(jié)果為null,這說(shuō)明他的附加載器是BootStrap,這個(gè)加載器是和虛擬機(jī)緊密聯(lián)系在一起的,在虛擬機(jī)啟動(dòng)時(shí),就會(huì)加載jdk中的類(lèi)。它是由C實(shí)現(xiàn)的,沒(méi)有對(duì)應(yīng)的java對(duì)象,所以返回null。但是在邏輯上,BootStrap仍是ExtClassLoader的父加載器。也就是說(shuō)每當(dāng)ExtClassLoader加載一個(gè)類(lèi)時(shí),總會(huì)委托給BootStrap加載。 

系統(tǒng)類(lèi)加載器和線程上下文類(lèi)加載器 

在java中,還存在兩個(gè)概念,分別是系統(tǒng)類(lèi)加載器和線程上下文類(lèi)加載器。 

其實(shí)系統(tǒng)類(lèi)加載器就是AppClassLoader應(yīng)用程序類(lèi)加載器,它兩個(gè)值得是同一個(gè)加載器,以下代碼可以驗(yàn)證: 

 ClassLoader appClassLoader = ClassLoaderTest.class.getClassLoader();
 System.out.println(appClassLoader); //sun.misc.Launcher$AppClassLoader@19821f
 
 ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();
 System.out.println(sysClassLoader); //sun.misc.Launcher$AppClassLoader@19821f
 //由上面的驗(yàn)證可知, 應(yīng)用程序類(lèi)加載器和系統(tǒng)類(lèi)加載器是相同的, 因?yàn)榈刂肥且粯拥?

 這兩個(gè)類(lèi)加載器對(duì)應(yīng)的輸出,不僅類(lèi)名相同,連對(duì)象的哈希值都是一樣的,這充分說(shuō)明系統(tǒng)類(lèi)加載器和應(yīng)用程序類(lèi)加載器不僅是同一個(gè)類(lèi),更是同一個(gè)類(lèi)的同一個(gè)對(duì)象。

每個(gè)線程都會(huì)有一個(gè)上下文類(lèi)加載器,由于在線程執(zhí)行時(shí)加載用到的類(lèi),默認(rèn)情況下是父線程的上下文類(lèi)加載器, 也就是AppClassLoader。 

 new Thread(new Runnable() {
 
 @Override
 public void run() {
 ClassLoader threadcontextClassLosder = Thread.currentThread().getContextClassLoader();
 System.out.println(threadcontextClassLosder); //sun.misc.Launcher$AppClassLoader@19821f
 }
 }).start();

這個(gè)子線程在執(zhí)行時(shí)打印的信息為sun.misc.Launcher$AppClassLoader@19821f,可以看到和主線程中的AppClassLoader是同一個(gè)對(duì)象(哈希值相同)。 

也可以為線程設(shè)置特定的類(lèi)加載器,這樣的話,線程在執(zhí)行時(shí)就會(huì)使用這個(gè)特定的類(lèi)加載器來(lái)加載使用到的類(lèi)。如下代碼: 

 Thread th = new Thread(new Runnable() {
 
 @Override
 public void run() {
 ClassLoader threadcontextClassLosder = Thread.currentThread().getContextClassLoader();
 System.out.println(threadcontextClassLosder); //jg.zhang.java.testclassloader.ClassLoaderTest$3@1b67f74
 }
 });
 
 th.setContextClassLoader(new ClassLoader() {});
 
 th.start();

在線程運(yùn)行之前,為它設(shè)置了一個(gè)匿名內(nèi)部類(lèi)的類(lèi)加載器對(duì)象,線程運(yùn)行時(shí),輸出的信息為:jg.zhang.java.testclassloader.ClassLoaderTest$3@1b67f74,也就是我們?cè)O(shè)置的那個(gè)類(lèi)加載器對(duì)象。 

類(lèi)加載器的可見(jiàn)性 

下面驗(yàn)證類(lèi)加載器的可見(jiàn)性,也就是 子類(lèi)的加載器可以看見(jiàn)所有的父類(lèi)加載器加載的類(lèi),而父類(lèi)加載器看不到子類(lèi)加載器加載的類(lèi)。 

以下代碼使用父加載器ExtClassLoader加載子加載器AppClassLoader路徑下的類(lèi),由輸出可知,是不可能實(shí)現(xiàn)的。 

 try {
 Class.forName("jg.zhang.java.testConcurrent.Person", true, 
  ClassLoaderTest.class.getClassLoader().getParent());
 System.out.println("1 -- 類(lèi)被加載");
 } catch (ClassNotFoundException e) {
 //e.printStackTrace();
 System.out.println("1 -- 未找到類(lèi)");
 }

輸出為 :1 -- 未找到類(lèi) 。說(shuō)明拋出了ClassNotFoundException異常。原因是讓ExtClassLoader加載 jg.zhang.java.testConcurrent.Person這個(gè)類(lèi)因?yàn)檫@個(gè)類(lèi)不在jre/lib/ext目錄下或者java.ext.dirs系統(tǒng)屬性定義的目錄下,所以拋出ClassNotFoundException。所以父加載器不能加載應(yīng)該被子加載器加載的類(lèi)。也就是說(shuō)這個(gè)類(lèi)在父加載器中不可見(jiàn)。這種機(jī)制依賴(lài)于委派機(jī)制。 

下面代碼使用子加載器AppClassLoader 加載父加載器BootStrap中的類(lèi),這是可以實(shí)現(xiàn)的。

 try {
 Class.forName("java.lang.String", true, 
  ClassLoaderTest.class.getClassLoader());
 System.out.println("2 -- 類(lèi)被加載");
 } catch (ClassNotFoundException e) {
 //e.printStackTrace();
 System.out.println("2 -- 未找到類(lèi)");
 }

 輸出為:2 -- 類(lèi)被加載。說(shuō)明成功加載了String類(lèi)。是因?yàn)樵谥付ㄓ葾ppClassLoader加載String類(lèi)時(shí),由AppClassLoader一直委派到BootStrap加載。雖然是由子加載器的父加載器加載的,但是也可以說(shuō),父加載器加載的類(lèi)對(duì)于子加載器來(lái)說(shuō)是可見(jiàn)的。這同樣依賴(lài)于委派機(jī)制。其實(shí)在虛擬機(jī)啟動(dòng)初期,java.lang.String已經(jīng)被BootStrap預(yù)加載了,這時(shí)再次加載,虛擬機(jī)發(fā)現(xiàn)已經(jīng)加載,不會(huì)再重復(fù)加載。這同時(shí)也證明了類(lèi)加載器的單一性。 

測(cè)試代碼 

到此為止,類(lèi)加載器的知識(shí)就全部講完了。以下是整個(gè)測(cè)試代碼: 

package jg.zhang.java.testclassloader;


/**
 * 參考ImportNew上的一篇文章<<類(lèi)加載器的工作原理>>,
 * 文章地址:http://www.importnew.com/6581.html
 * 
 * Java類(lèi)加載器基于三個(gè)機(jī)制:委托、可見(jiàn)性和單一性。
 * 委托機(jī)制是指將加載一個(gè)類(lèi)的請(qǐng)求交給父類(lèi)加載器,如果這個(gè)父類(lèi)加載器不能夠找到或者加載這個(gè)類(lèi),那么再加載它。
 * 可見(jiàn)性的原理是子類(lèi)的加載器可以看見(jiàn)所有的父類(lèi)加載器加載的類(lèi),而父類(lèi)加載器看不到子類(lèi)加載器加載的類(lèi)。
 * 單一性原理是指僅加載一個(gè)類(lèi)一次,這是由委托機(jī)制確保子類(lèi)加載器不會(huì)再次加載父類(lèi)加載器加載過(guò)的類(lèi)。
 * 
 * 三種類(lèi)加載器: 每個(gè)類(lèi)加載器在創(chuàng)建的時(shí)候已經(jīng)指定他們對(duì)應(yīng)的目錄, 也就是說(shuō)每個(gè)類(lèi)加載器去哪里加載類(lèi)是確定的
 * 我認(rèn)為在ClassLoader類(lèi)中應(yīng)該會(huì)有g(shù)etTargetPath()之類(lèi)的方法, 得到他們對(duì)應(yīng)的路徑,找了找jdk的文檔,發(fā)現(xiàn)是沒(méi)有的.
 * AppClassLoader -- 加載classpath指定的路徑中的類(lèi)
 * ExtClassLoader -- 加載jre/lib/ext目錄下或者java.ext.dirs系統(tǒng)屬性定義的目錄下的類(lèi)
 * BootStrap  -- 加載JRE/lib/rt.jar中的類(lèi)
 * 
 * 
 * 
 * @author zhangjg
 *
 */
public class ClassLoaderTest {

 
 public static void main(String[] args) {
 test1();
 test2();
 test3();
 }

 /**
 * 驗(yàn)證線程上下文類(lèi)加載器
 */
 private static void test3() {
 /**
 * 1 每個(gè)線程都會(huì)有一個(gè)上下文類(lèi)加載器,由于在線程執(zhí)行時(shí)加載用到的類(lèi),默認(rèn)情況下是父線程
 * 的上下文類(lèi)加載器, 也就是AppClassLoader
 */
 new Thread(new Runnable() {
 
 @Override
 public void run() {
 ClassLoader threadcontextClassLosder = Thread.currentThread().getContextClassLoader();
 System.out.println(threadcontextClassLosder); //sun.misc.Launcher$AppClassLoader@19821f
 }
 }).start();
 
 /**
 * 2 也可以給創(chuàng)建的線程設(shè)定特定的上下文類(lèi)加載器
 */
 Thread th = new Thread(new Runnable() {
 
 @Override
 public void run() {
 ClassLoader threadcontextClassLosder = Thread.currentThread().getContextClassLoader();
 System.out.println(threadcontextClassLosder); //jg.zhang.java.testclassloader.ClassLoaderTest$3@1b67f74
 }
 });
 
 th.setContextClassLoader(new ClassLoader() {});
 
 th.start();
 }

 /**
 * 測(cè)試可見(jiàn)性,可見(jiàn)性依賴(lài)于委托機(jī)制
 */
 private static void test2() {
 
 /**
 * 1 讓ExtClassLoader加載 jg.zhang.java.testConcurrent.Person這個(gè)類(lèi)
 * 因?yàn)檫@個(gè)類(lèi)不在jre/lib/ext目錄下或者java.ext.dirs系統(tǒng)屬性定義的目錄下
 * 所以拋出ClassNotFoundException
 * 
 * 所以父加載器不能加載應(yīng)該被子加載器加載的類(lèi),這個(gè)類(lèi)在父加載器中不可見(jiàn)
 * 這種機(jī)制依賴(lài)于委派機(jī)制
 */
 
 try {
 Class.forName("jg.zhang.java.testConcurrent.Person", true, 
  ClassLoaderTest.class.getClassLoader().getParent());
 System.out.println("1 -- 類(lèi)被加載");
 } catch (ClassNotFoundException e) {
 //e.printStackTrace();
 System.out.println("1 -- 未找到類(lèi)");
 }
 
 
 /**
 * 2 讓AppClassLoader加載java.lang.String類(lèi)
 * 沒(méi)有拋出異常,說(shuō)明類(lèi)被正常加載了
 * 雖然是由AppClassLoader一直委派到BootStrap而加載的
 * 所以可以說(shuō),父加載器加載的類(lèi)對(duì)于子加載器來(lái)說(shuō)是可見(jiàn)的,這同樣依賴(lài)于委派機(jī)制
 * 
 * 其實(shí)在虛擬機(jī)啟動(dòng)初期,java.lang.String已經(jīng)被BootStrap預(yù)加載了
 * 這時(shí)再次加載,虛擬機(jī)發(fā)現(xiàn)已經(jīng)加載,不會(huì)再重復(fù)加載
 */
 try {
 Class.forName("java.lang.String", true, 
  ClassLoaderTest.class.getClassLoader());
 System.out.println("2 -- 類(lèi)被加載");
 } catch (ClassNotFoundException e) {
 //e.printStackTrace();
 System.out.println("2 -- 未找到類(lèi)");
 }
 
 }

 /**
 * 驗(yàn)證三種類(lèi)加載器的父子關(guān)系
 */
 private static void test1() {
 ClassLoader appClassLoader = ClassLoaderTest.class.getClassLoader();
 System.out.println(appClassLoader); //sun.misc.Launcher$AppClassLoader@19821f
 
 ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();
 System.out.println(sysClassLoader); //sun.misc.Launcher$AppClassLoader@19821f
 //由上面的驗(yàn)證可知, 應(yīng)用程序類(lèi)加載器和系統(tǒng)類(lèi)加載器是相同的, 因?yàn)榈刂肥且粯拥?
 
 ClassLoader extClassLoader = appClassLoader.getParent();
 System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@addbf1
 //AppClassLoader的父加載器是ExtClassLoader
 
 System.out.println(extClassLoader.getParent()); //null
 //ExtClassLoader的父加載器是null, 也就是BootStrap,這是由c語(yǔ)言實(shí)現(xiàn)的

 }

}


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis xml中特殊字符處理及特殊符號(hào)

    mybatis xml中特殊字符處理及特殊符號(hào)

    這篇文章主要介紹了mybatis xml中特殊字符處理及mybatis特殊符號(hào)處理技巧,mybatis特殊符號(hào)處理給大家介紹了兩種寫(xiě)法,感興趣的朋友一起看看吧
    2018-03-03
  • mybatis新手快速入門(mén)以及一些錯(cuò)誤匯總

    mybatis新手快速入門(mén)以及一些錯(cuò)誤匯總

    這篇文章主要給大家介紹了關(guān)于mybatis新手快速入門(mén)以及一些錯(cuò)誤的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 解讀查看zookeeper事務(wù)日志的正確姿勢(shì)

    解讀查看zookeeper事務(wù)日志的正確姿勢(shì)

    這篇文章主要介紹了解讀查看zookeeper事務(wù)日志的正確姿勢(shì)。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)延遲加載及緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java并發(fā)之原子操作類(lèi)和非阻塞算法

    java并發(fā)之原子操作類(lèi)和非阻塞算法

    這篇文章主要為大家詳細(xì)介紹了java并發(fā)之原子操作類(lèi)和非阻塞算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Mybatis-Plus通用枚舉的使用詳解

    Mybatis-Plus通用枚舉的使用詳解

    這篇文章主要介紹了Mybatis-Plus通用枚舉的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java正則表達(dá)式處理花括號(hào)內(nèi)容替換賦值問(wèn)題

    java正則表達(dá)式處理花括號(hào)內(nèi)容替換賦值問(wèn)題

    這篇文章主要介紹了java正則表達(dá)式處理花括號(hào)內(nèi)容替換賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring boot 配置多個(gè)redis的方法示例

    Spring boot 配置多個(gè)redis的方法示例

    這篇文章主要介紹了Spring boot 配置多個(gè)redis的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn)

    SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 實(shí)例化JFileChooser對(duì)象報(bào)空指針異常問(wèn)題的解決辦法

    實(shí)例化JFileChooser對(duì)象報(bào)空指針異常問(wèn)題的解決辦法

    今天小編就為大家分享一篇關(guān)于實(shí)例化JFileChooser對(duì)象報(bào)空指針異常問(wèn)題的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論

蕲春县| 修武县| 三门峡市| 皋兰县| 汶上县| 兴城市| 保靖县| 措美县| 蒙山县| 遂溪县| 始兴县| 炎陵县| 灌阳县| 大余县| 荥经县| 南充市| 泰安市| 珲春市| 县级市| 乌鲁木齐县| 开平市| 潍坊市| 阜平县| 同心县| 石狮市| 大竹县| 扎兰屯市| 泸水县| 延寿县| 东兰县| 临漳县| 社旗县| 奎屯市| 儋州市| 吴桥县| 南平市| 板桥市| 舟山市| 哈尔滨市| 冕宁县| 时尚|