簡體   English   中英

指定類的java.lang.ClassNotFoundException

[英]java.lang.ClassNotFoundException for a specified class

在我的主要內容中,我有以下聲明

Class booki = Class.forName("Book");

拋出java.lang.ClassNotFoundException異常

當我使用像Class booki = Class.forName("javatests.Book");這樣的完整路徑時Class booki = Class.forName("javatests.Book"); 沒關系。

主類和Book類在同一個包中,我也嘗試使用import static javatests.Book.*; 但如果我沒有設置完整路徑javatests.Book它仍會引發異常。 有人能解釋一下為什么嗎?

Class.forName將類的完全限定類名解析。 由於方法不知道調用類的包,調用類的包和調用類中的import都不起作用。

來自docs Class#forName

 public static Class<?> forName(String className)
                    throws ClassNotFoundException

參數:
className - 所需類的完全限定名稱。

所以這不會拋出ClassNotFoundException

Class booki = Class.forName("javatests.Book");  

例如,不需要在java程序中導入java.lang.*包,而是從java.lang包加載類Thread需要編寫

Class t = Class.forName("java.lang.Thread");

上面的代碼片段返回名為java.lang.Thread的類的運行時類描述符

除非它在同一個包中, 否則您總是需要一個合格的類名。 如果我在我的包中定義一個類foo,我可以調用一個方法Class testClass = Class.forName("foo") ,但我不能調用Class testClass = Class.forName("SecureRandom"); 即使我導入SecureRandom。 這就是函數的工作原理。 它可能有一個快捷方式,它試圖在本地包中找到東西,但在這背后沒有做太多。

首先,Book類必須在包javatests中。
JVM通過類路徑按名稱加載類。 類路徑中沒有名為“Book”的類。 所以當借口Class.forName(“Book”)時,JVM會給你一個ClassNotFoundException。 但'Class.forName(“javatests.Book”)'告訴JVM名為'Book'的類在包'javatests'中。 所以JVM可以找到並加載它。

我希望我的回答很有幫助:)

JLS提供以下描述:

類查找始終代表引用類,並通過ClassLoader實例完成。 給定類的完全限定名稱 ,此方法嘗試查找,加載和鏈接類。

JDK使用一個ClassLoader實例來搜索由CLASSPATH環境變量指定的目錄樹根集; 顯然它不知道它被稱為的地方(包)。 這就是它需要完全限定名稱的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM