簡體   English   中英

Java中的傳遞引用

[英]Transitive References In Java

tldr; 是什么使得有必要在構建路徑中包含傳遞引用?

說明

我嘗試分析一些用Eclipse工作區編譯的Java源代碼。 工作區中有許多項目。

我嘗試檢測項目之間未使用的引用。

我的第一種方法是瀏覽所有項目,並從.classpath文件中獲取所有引用,然后分析同一項目中的所有.java文件。 如果.java文件具有來自另一個項目的import語句,則對該另一個項目的引用是必需的。 這樣,我在類路徑中找到了沒有“合理性”的引用。

但是,當我刪除這些引用時,構建就中斷了。 一個這樣的情況是,如果引用的類正在從第三個項目擴展一個類。 該項目是暫時引用的,需要在構建路徑中。

我想知道還有哪些其他類型的關系(繼承除外)導致類路徑中的傳遞引用? 那么在每個項目的繼承類都位於另一個項目中的情況下,多個繼承層又如何呢?

給定

  • 具有引用了項目B中的ClassB的ClassA的ProjectA
  • 具有ClassC的第三個ProjectC

在這種情況下,您需要從projectA引用ProjectC

  • 如果ClassB從classC繼承/實現,並且ClassA從ClassB調用方法。
  • 如果ClassA調用(!)來自ClassB的方法,該方法的簽名包含ClassC(參數或返回值)(對於異常也是如此!)

此外,通過查看ClassA的import語句不能找到ProjectA的所有引用。

  • 如果ClassA使用了ClassC,並且與ClassA處於同一軟件包中,則ClassC將不會在導入中列為ClassC。
  • 如果ClassA以其全名(包括包名)使用ClassC,則不會創建任何Import語句。

是什么使它必要?

Java編譯的強制規則使其成為必需。 Java需要知道代碼領域中的內容,以驗證是否遵循規則。 域是您的類路徑中的jar文件集。 如果實現接口,則實現接口的非抽象實現類或類的非抽象子級需要實現接口。 覆蓋注釋需要得到滿足。 從代碼角度和人員角度來看,對其他方法的引用都必須可見。 如果方法使用其他類或接口中的方法,則調用類需要知道該方法的簽名。

我將如何處理?

我將使用“分類器”來指代類和接口。 您要從一組已知的經過驗證的分類器和已知的未經驗證的分類器開始。
從已知的未經驗證的分類器開始,是目標項目中的所有分類器,而已知的驗證分類器為空。

遍歷每個未驗證的分類器,並識別所有未知的使用過的分類器,並將它們添加到未驗證的分類器集中。

驗證當前未驗證的分類器在類路徑上。 如果找不到錯誤。

將已處理的分類器從未驗證的移動到已驗證的。

重復此過程,直到所有分類器均已通過驗證。

使用的分類器包括字段類型,方法返回類型,方法參數類型,參數中的變量類型,擴展類,已實現的接口,注釋以及在某些情況下的Javadoc引用。 根據您的項目規則,僅靠進口可能會錯過一些事情。 接口可以在相同的程序包中,但源於不同的項目。

為什么反射和Spring配置需要超出范圍?

此類操作使用基於文本的切換來完成代碼。 Reflection可以使用字符串“ Package.classname”創建一個類,而無需將其標識為“已用類”。 這些概念將需要超出純源代碼分析或字節碼分析范圍的額外處理。

如果您想更深入地學習,那么Java虛擬機規范可以使您對類文件需要運行的內容有更深入的了解。 特別是Java 10規范中的“ 4.類文件格式”和“ 5.加載,鏈接和初始化”。 https://docs.oracle.com/javase/specs/

暫無
暫無

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

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