成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

new的奧秘:Java中new關鍵字與類加載器

原創
開發 后端
"new"可以說是Java開發者最常用的關鍵字,我們使用new創建對象,使用new并通過類加載器來實例化任何我們需要的東西,但你是否深入了解過new在編譯的瞬間都做了什么?

【51CTO獨家特稿】在Java中使用new關鍵字創建對象變得很容易了,事實上,對這些事情你是不需要考慮的。需要訪問一個文件嗎?只需要創建一個新的File實例:new File(“build.properties”),對于大多數Java開發人員而言,這就是他們需要知道的一切,是不是很簡單呢?!但當你使用了多個類加載器時,問題就不一樣了。

這是我一年多來的第一反應,我就是不想知道這些東西,但奇怪的是,類加載器其實非常簡單,大多數Java開發人員都知道編譯時通過Java文件生成.class類文件,然后由Java虛擬機(JVM)載入這些編譯后的類,這就是類加載器最基本的功能,但是和線程一樣,問題不是理解他們做什么,而是讓它們一起工作。

你聽到過多少次“這是類加載器的問題”?我承認我聽到過很多次,我自己也說過很多次。只要你的應用程序中不止一個類加載器,你不得不擔心哪些類可以相互看到對方,這很容易成為一場噩夢。有關類加載器行為我將另外用一篇文章來說,現在我們還是回到new關鍵字吧。

當你創建一個新對象時,JVM首先加載類,當你使用new時這是透明的,問題是使用什么類加載器?以及為什么要使用它?
設想一個Grails情景,我們有一套基于Gant的構建系統,載入構建腳本并執行它們,我們以實例化一個Jetty服務器并啟動它作為示例,對象的創建順序是這樣的:

Java中對象創建的順序 
對象的創建順序

事實上,上圖展示的僅僅是一個簡化的真實情況。

前3個類都在我們將要調用的生成類加載器的類路徑下,因此是一次性將生成時需要用到的所有類全部加載了,但Jetty的Server類怎么加載呢?最重要的是要知道Server類必須要通過加載Grails Web應用程序相同的類加載器加載,雖然你可以將你自己的類加載器嵌入到服務器中,如果與加載Server的不一樣,將會出現可怕的類加載器問題。

考慮到這一點,讓我們看看如果RunApp腳本使用new創建服務器實例會發生什么:

  1. def server = new org.mortbay.jetty.Server()  
  2. ...  
  3. server.start() 

現在你應該問你自己“加載Server類該使用什么類加載器?”,這是一個關鍵問題,因為它決定了使用什么類加載器加載整個Web應用程序,也就決定了應用程序的運行時應該使用和依賴的類路徑,在這種情況下,無論使用什么類加載器加載RunApp腳本,new操作符都會有效地授權給

  1. this.getClass().getClassLoader() 

我們的例子是什么意思呢?它意味著生成類加載器被用于加載Server類,因此也必須用于加載Web應用程序類,換句話說,所有應用程序的運行時依賴必須包括在生成類加載器中。你可能會問,這樣會不會有問題?回答是有一個潛在的問題和一個實際的問題。
潛在的問題是類沖突,如果Web應用程序依賴一個已經存在于生成系統中不同版本的庫會怎么樣?如果所有Apache XML API庫都在類路徑下,這是一個特殊的問題,絕對會導致大破壞。

實際的問題是在類路徑中JAR文件越多,JVM尋找類的時間就越長,這意味著啟動時間就越長,這也是OSGi設計要解決的問題之一,為什么要將JAR放在生成類路徑下呢?生成時本身是不需要它們的。

解決辦法是確定類加載器的邊界,使用映射實例化你的對象:

  1. def runtimeClassLoader = new URLClassLoader(...)  
  2. def server = runtimeClassLoader.loadClass("org.mortbay.jetty.Server").newInstance()  
  3. ...  
  4. server.start() 



 

責任編輯:佚名 來源: 51CTO.com
相關推薦

2009-08-21 14:16:35

C# New關鍵字

2023-03-24 08:01:27

Go語言內存

2010-01-15 15:45:10

VB.NET New關

2024-06-04 17:02:38

newC#編程語言

2012-03-13 14:41:41

JavaJVM

2024-03-28 10:40:43

javanew關鍵字

2024-12-31 00:05:24

new?關鍵字C#

2009-06-25 10:33:53

StaticJava類

2020-08-10 08:00:13

JavaFinal關鍵字

2012-06-02 00:53:39

Javafinally

2022-05-06 08:32:40

Pythonwith代碼

2024-04-08 11:35:34

C++static關鍵字

2024-11-20 15:55:57

線程Java開發

2009-09-28 11:34:49

Javascript

2024-12-26 00:28:59

C#base?關鍵字

2025-01-09 10:30:40

2023-11-19 22:52:42

2011-06-14 13:26:27

volatile

2012-03-01 12:50:03

Java

2017-10-20 11:12:12

數據類型關鍵字對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线视频 | 国产视频导航 | 久国产 | 男女精品网站 | 久久久久久蜜桃一区二区 | 羞羞色影院 | 女同久久另类99精品国产 | 久热精品在线观看视频 | 天天射夜夜操 | 免费三级网| 国产福利精品一区 | 波多野吉衣在线播放 | 欧美炮房| 韩日精品在线观看 | 国产精品一区二区久久精品爱微奶 | 亚洲精品一区二区三区中文字幕 | 国产精品伦一区二区三级视频 | 国产精品久久久久久久岛一牛影视 | 99re6在线视频精品免费 | 三区四区在线观看 | 成人国产精品久久 | 在线观看国产网站 | 日韩欧美网| 久久精品免费 | 日韩高清中文字幕 | 日本网站免费在线观看 | 日韩在线免费 | 亚洲国产成人精品女人久久久 | 天堂网av在线 | 一区二区三区四区在线 | 中文字幕第九页 | 久久国产精品偷 | 韩国久久| 精品国产一区二区三区久久久四川 | 精品亚洲一区二区三区 | 免费一看一级毛片 | 成人日韩精品 | 国产成人免费视频网站视频社区 | 日日干干 | 天天干视频 | 情侣酒店偷拍一区二区在线播放 |