4

私は SDK を作成しており、クラスを別のパッケージに分離しようとしています。これらのクラスは他の共有クラスを使用しています。問題は、共有クラスを公開すると、私のクラスだけでなく、全員がそれらを見ることができることです。アプリケーションからのみアクセスできるようにする正しい方法は何ですか?

例 :


MyClass1 をパッケージ化する

パッケージ b MyClass2

パッケージ c public MySharedClass


c は public であるため、MySharedClass はそれにアクセスできますが、問題はそれが世界にも表示されることです。どうすればそれを防ぐことができますか?

4

5 に答える 5

3

パッケージはすべて Java で「公開」されており、保護できるのはパッケージ内のクラスです。クラスの可視性を特定のパッケージのみに制限するには、次のように宣言します (可視性修飾子なし):public

class MyClass {
    // ...
}

そうすれば、MyClass と同じパッケージ内のクラスだけがそれを見ることができます。

于 2011-12-27T17:43:58.847 に答える
3

重要:

共有クラスは、一般的にアクセス可能な一連のインターフェイスによって定義できます。実際の実装は、 を介して明示的にロードする必要がありClassloaderます。その後、実装クラスへのアクセスを制御する Java セキュリティ管理メカニズムを適用するだけです。誰でもインターフェイスを見ることができ、実際の実装へのアクセスは SDK に制限されます。

(上記のバリアントは、すべての Web/アプリ サーバーが行う必要があることです。Tomcat が他のアプリの「パブリック」クラスへのアクセスをどのように防いでいると思いますか?)

編集:上記のメモはランタイムメカニズムです。静的 (ポスト) コンパイル アプローチもあります。たとえば、ここでは APT が効果的です。当然のことながら、私はあなたのパッケージの再構築(OPで)に取り組んでおらず、一般的なアプローチへのアクセスを保護する方法にのみ取り組んでいます. しかし、これらは少し「ハッキー」です。クラスローディングのランタイムメカニズムは標準的であり、厳密にはより正確です。

于 2011-12-27T18:00:20.717 に答える
1

クラスが同じパッケージでのみアクセスする場合は、保護された修飾子を使用できます。そうでなければ、可能性はありません。

于 2011-12-27T17:51:15.387 に答える