簡體   English   中英

如何檢查 Java 源代碼中是否沒有對包的引用

[英]How to check if there is no reference to a package in a Java source

在 Java 源代碼中,我不想使用某些包。 例如,我不想要任何對swing、io 或其他的引用。

是否有系統可以在編譯時或測試時進行檢查?

例如,假設注釋

@NoPackage("javax.swing")
class Foo
{
    private JFrame fram; // NOT OK.
}

為什么我需要這個? 因為我有一個帶有 Swing 的應用程序,我想用一個使用 Swing 的部分重構它,而其他不使用它的部分,因為我想將它移植到其他 ui 內容(web、pda 等)。

我不知道這樣的工具,但創建一個並不復雜。 對所有使用的類的引用都在類文件中編碼。 使用一些類文件庫,可以檢查類文件,並列出所有使用的類(或包)。 如果插入了@NoPaquage 之類的注釋,那么該工具就可以檢查該類是否真的不使用該包。

我可以想到一種相當笨拙的方法來做到這一點。 但是,您需要有一個此類禁止類的列表,而不僅僅是包。 假設您想禁止使用javax.swing.JFrame

只需創建下面的假類。

package javax.swing;

class JFrame {
}

請注意,該類不是公共的,因此任何導入它的嘗試都會導致編譯錯誤“ The type javax.swing.JFrame is not visible.

您可以從所有此類禁止類中創建一個 JAR 文件,並確保它們最后由類加載器加載。 這確保肯定會發生編譯器錯誤。 只要您想運行此測試,您就可以簡單地選擇包含/排除此 JAR 文件 - 如果使用 ant,這是一項微不足道的任務。

我認為這將是非常困難的,因為還有一個類使用反射來獲得它想要的東西的可能性。

如果我嘗試這樣做,我會編寫自己的自定義類加載器,但我不確定類加載器接口是否知道實際嘗試加載哪個類。 我認為如果你想禁止所有代碼使用某個包,你可以使用自定義類加載器,但如果你想要它更具體的類,你可能需要像grep那樣的手冊 - 代碼?

像這樣的東西:

$ find srcTree -name \*.java | xargs grep javax\\.swing

您不能讓 JVM 過濾您正在編寫的代碼。 但是,您可以使用泛型來限制所有公共 API 中允許的類。 您還可以像這樣限制繼承:

class Parent {
    public Parent() throws Exception {
        if (this instanceof Child)
            throw new Exception("It's a child");
    }
}

public class Child extends Parent {
    public Child() throws Exception {
        super();
    }
}

您可以在導入區選擇要使用的包。

在 Eclipse 中,您可以選擇您的類來自的包。

您必須刪除導入行才能在另一個包中選擇類。

暫無
暫無

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

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