![](/img/trans.png)
[英]Extends ValveBase class : 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.