1

私は現在、いくつかのフレームワークコードを書いています。最近、そのパッケージの外部のクラスがそれにアクセスする必要があるため、公開する必要があるクラスにいくつかのメソッドを追加する必要がありました。そのクラスのクライアントもそのクラスにアクセスできますが、クライアントがこれらのメソッドにアクセスできるようにする必要はありません。フレームワーク内の他のフレームワーク クラスから見えるようにしたいだけです。

クライアントもアクセスできるため、それらをパブリックとしてマークしても役に立ちません。このクラスの Java パッケージの外部にあるフレームワーク クラスがそれにアクセスする必要があるため、それを保護またはパッケージ プライベートとしてマークしても役に立ちません。

この問題を解決するにはどうすればよいですか?

ありがとう!

4

7 に答える 7

1

使用しているフレームワークはわかりませんが、アスペクトがある場合は、発信者または資格情報に基づいてそのパッケージへの呼び出しを制限できます。

「クラスにアクセスできる」と「メソッドにアクセスできない」を調整するのに苦労しています。どっち?そのメソッドを呼び出せない場合、クラスへのアクセスはどういう意味ですか?

あなたのフレームワークが、Springのようなものでは利用できない世界に何を追加するのだろうか。

于 2012-10-08T21:47:29.210 に答える
0

私が考えることができる、あなたができるコンパイル時のチェックは他にありません。Javaには、説明したもの以外の可視性修飾子はありません。

フレームワークのみがアクセスできるように特定のメソッドを制限する場合は、最初に「パッケージプライベート」可視性レベルを使用するようにフレームワークを再構築することを検討する必要があります。public誰もがアクセスできることを意味する非常に明確なセマンティクスを持っています。何かがフレームワークでのみ使用されることを意図している場合は、protected他の人がそれを見ることができないように、それを「プライベートパッケージ」にする必要があります。

を使用してメソッドを呼び出したクラスを確認することで、実行時に何かを行うことができStackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()ますが、これは(例外を作成するため)うまく機能しないため、注意が必要です。

編集:ここで説明されているメソッドを使用して、呼び出し元のクラスを把握するためのもう少し効率的な方法があります。

于 2012-10-08T21:50:29.987 に答える
0

他の回答、特にデュアル インターフェイスのアイデアには、興味深い有用な提案がいくつかあります。

しかし、アクセス制御を実装したり、API 規律を強制したりするのに、あまり力を入れるべきではないというのが私の見解です。あなたが何をしようとも、プログラムが「内部」インターフェースを使用しないようにするためにあなたが提起した障壁を回避して、人々がプログラムできるようになるのは事実です。これを止める唯一の方法は、セキュリティ サンドボックスでコードを実行するよう強制することです。そして、それが実用的であるとは思えません。

必ず、顧客コードが内部 API を使用するのは悪い考えであることをできるだけ明確にするようにしてください。ただし、多くの余分なコード、高価な実行時チェック、およびその他の邪魔になるものを追加しないでください。顧客を責任ある大人として扱います。彼らがあなたの強いアドバイスを無視したい場合は、彼らに結果に対処させてください.

于 2012-10-09T13:42:29.000 に答える
0

いくつかの解決策:

  1. 顧客が知っているインターフェイスである「パブリック」インターフェイスを定義し、クラスはこの「パブリック」インターフェイスを拡張する別の「内部」インターフェイスを実装します。
  2. OSGIJava8 modulesなどのモジュール管理フレームワークを使用します。
于 2012-10-08T21:59:06.320 に答える
0

あなたの投稿を読んで、少し前に apidesign.org で読んだ FriendPackages というものを思い出しました。私はこのソリューションを使用していませんが、興味深い読み物だと思います。

于 2012-10-08T21:53:10.673 に答える
0

基本クラスが「フレームワーク」パッケージに属する場合の継承では、パッケージの可視性で「フレームワークのみ」のメソッドを宣言します。

「フレームワーク」パッケージのみがそれらを呼び出すことができます。

于 2012-10-08T21:53:28.787 に答える
0
  • というインターフェースを作るMyService
  • お気に入りのメソッド アクセサーをそのインターフェイスに配置します。
  • その 2 つの異なるバージョンを実装します。1 つはリモート用、もう 1 つは内部使用用
  • return new IllegalAccessException()メソッドを保護するには、クライアント バージョンの実装 に追加します。
  • 実装が返されるシングルトン ファサードを使用します。public static MyService getService(Boolean client)
于 2012-10-08T22:07:45.270 に答える