2009-12-23 63 views
1

我怎麼能證明類加載只在Java中發生過一次?這是一個僞命題嗎?我怎麼能證明類加載在Java只發生一次?

+0

我不確定你能證明這一點,因爲你確實要求證明一個否定結果(「證明一個班級沒有第二次加載」)。 – cletus 2009-12-23 02:43:21

+0

您將不得不提供更多信息。從廣義上講,世界上有很多應用程序在進行類加載的任何次數。如果你的意思是你特意試圖在自己的應用程序中進行約束,那麼這是一個與具體答案不同的問題。 – PSpeed 2009-12-23 03:06:26

回答

6

據西方哲學,一個「僞命題」的布萊克威爾解釋如下:

維特根斯坦在「邏輯哲學論」中提出的一個術語,指任何試圖說出只能顯示的判斷。與其他命題不同,僞命題不能被分析爲原子圖像及其組合,因此它們不是世界的圖像。維特根斯坦認爲,以不同的方式,邏輯,數學,自然科學,倫理學和哲學的先驗部分 - 包括他自己的邏輯哲學 - 的命題 - 的命題都是僞命題。邏輯實證主義者在他們對形而上學的攻擊中發展了這個觀點,認爲所有聲稱能夠做出事實主張但不能被經驗證實的命題和陳述都是僞命題。他們具有情感意義,但缺乏認知意義。有很多嘗試通過邏輯實證主義來檢索至少一些被這種方式拋棄的領域。 「數學的命題是方程式,因此僞命題。」維特根斯坦邏輯哲學論

如果你在這個意義上使用「僞命題」,那麼你的主張,即使我們可能是一個僞命題根據維特根斯坦的觀點,爲它設計一個數學證明,所有的數學都是僞命題。如果不可能通過觀察來證實「類加載只發生一次」的命題總是如此。

但對我而言,這只是說當我們談論IT主題時,標籤「僞命題」不是有用的標籤。而且在這種情況下使用它的人要麼並不真正理解這個術語,要麼就是擺出姿勢。

我懷疑是否可以在數學上證明一個類只能加載一次,因爲你必須證明這是用於任何(理論上)可能的類加載器。但坦率地說,誰在乎!我很高興地聲明,允許類加載多次的任何類加載器是。(實際上,如果你有多個類加載器,它可能在每個類加載器中加載一次相同的字節碼文件,但是你從Java執行模型的角度得到的是具有相同類的不同類姓名。)

1

我想你可能會對類的靜態初始化鎖定一個全球性的資源(如文件,套接字):

public class MyClass{ 

    static { 
    if (!lockFile()) 
     throw new IllegalStateException("Attempt to load class twice"); 
    } 

    ... 
} 
當然

,它絕對有可能加載類不止一次如果你使用多個類加載器。一直在服務器應用程序中發生。

+0

這是一個實例初始值設定項。 – BalusC 2009-12-23 03:49:07

+0

@BalsuC:我修正了錯字。答案 – Chii 2009-12-23 03:52:16

+0

中的含義很明確,謝謝,Chii--你太善良了。我把這更多地歸類爲我的一個頭腦忽略,而不是類型o。 「這是重要的思想」「好吧,想想更難!」 – 2009-12-24 03:32:41

1

正如克萊圖斯所說,證明一個負面是很難做到的。所以你可能想把你的陳述改進爲更窄的東西。你可以說「根據java語言(或jvm)規範,一個類永遠不會被加載兩次」,然後引用規範的相關部分。或者你可以嘗試「在sun的jvm中,版本XX.XX,只要某些其他條件(比如沒有時髦的類加載器)被滿足,一個類永遠不會被加載兩次(列出所有的條件將作爲練習原始海報)

對於一個天真的證明,你可以編寫一個Foo類的程序,在其靜態初始化器中打印「hello world」,然後實例化2個Foo實例,並向每個人展示只有一個「hello world」被打印。出這可能意味着一個類中沒有加載每次創建該類的對象時