7

Javaソースでは、パッケージを使用したくありません。たとえば、swing、io、またはその他への参照は必要ありません。

コンパイル時、またはテスト時にそれをチェックするシステムはありますか?

たとえば、想定される注釈付き

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

なぜこれが必要なのですか?私はswingを使用するアプリケーションを持っていて、swingを使用する部分と使用しない部分でリファクタリングしたいので、他のuiのもの(web、pdaなど)に移植したいからです。

4

6 に答える 6

3

私はそのようなツールを知りませんが、それを作成するのはそれほど複雑ではありません。使用されるすべてのクラスへの参照は、classfileにコード化されます。一部のクラスファイルライブラリを使用すると、クラスファイルを検査し、使用されているすべてのクラス(またはパッケージ)を一覧表示できます。@NoPaquageのようなアノテーションが挿入されている場合、ツールは、クラスが実際にそのパッケージを使用しているかどうかを確認できます。

于 2012-04-11T14:27:27.737 に答える
2

私はこれを行うための1つのかなりハッキーな方法を考えることができます。ただし、パッケージだけでなく、そのような禁止されたクラスのリストを用意する必要があります。たとえば、の使用を禁止したいとしますjavax.swing.JFrame

以下の偽のクラスを作成するだけです。

package javax.swing;

class JFrame {
}

クラスは公開されていないため、インポートしようとするとコンパイルエラーが発生することに注意してください " The type javax.swing.JFrame is not visible."

このようなすべての禁止されたクラスからJARファイルを作成し、それらがクラスローダーによって最後にロードされることを確認できます。これにより、コンパイラエラーが確実に発生します。このテストを実行するときはいつでも、このJARファイルを含める/除外することを選択できます。antを使用する場合は簡単な作業です。

于 2012-04-11T14:20:11.723 に答える
0

インポートエリアで使用するパッケージを選択できます。

Eclipseでは、クラスのパッケージを選択できます。

別のパッケージのクラスを選択するには、インポート行を削除する必要があります。

于 2012-04-11T15:55:55.360 に答える
0

リフレクションを使ってクラスが欲しいものを手に入れる可能性もあるので、これは非常に難しいと思います。

これを行おうとすると、独自のカスタムクラスローダーを作成しますが、クラスローダーインターフェイスが実際にロードしようとしているクラスを認識しているかどうかはわかりません。すべてのコードが特定のパッケージを使用することを禁止したい場合はカスタムクラスローダーを使用できると思いますが、よりクラス固有にしたい場合は、コードをgrepするなどの手動が必要になる場合がありますか?

于 2012-04-11T14:17:31.913 に答える
0

このようなもの:

$ find srcTree -name \*.java | xargs grep javax\\.swing
于 2012-04-11T14:21:16.470 に答える
0

作成しているコードを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();
    }
}
于 2012-04-11T14:30:13.880 に答える