5

2 つの質問に答えることができず、チャンスを台無しにしてしまいました。私はまだ答えを知らないので、それらを探しています:

[1] プライベート変数を持ち、getter/setter メソッドを持たない Java クラスがあります。そのような変数をどのように変更しますか?

私の答え: できません。外部からプライベート変数にアクセスすることはできません。インタビュアー:正解は「リフレクションを使う」です。

[2] 上記を行うために、どのリフレクション手法を使用しますか? 私の答え:わかりません。インタビュアー: さようなら。

私の経験から、(1)クラスが存在するかどうかを確認します(2)インスタンスを作成します(3)メソッドが存在するかどうかを確認します(4)メソッドを呼び出します(5)クラスのインスタンスを続行します。もちろん、ClassNotFound や MethodInvocation などの例外をキャッチします。しかし、プライベート変数を変更するトリックはありますか? そして、人々はこれをしますか?ティア。

4

2 に答える 2

2

これを考えると:

プライベート変数があり、getter/setterメソッドがないJavaクラスがあります。そのような変数をどのように変更しますか?

私の答えは、特定のセッター/ゲッターは必要なく、他の非特定の方法でそれらを変更するだけだということです。セッター/ゲッターは、多くの場合、実装を公開していると見なすことができます。

フィールドにアクセスできるようにするには、Field.setAccessible()を呼び出す必要があります。

それは私が頭のてっぺんからわからない種類のトピックであり、それを使用するかどうか/いつ使用するかを調べる必要があります(最後に使用したのはいつか思い出せません)。インタビュアーがこれに夢中になっているのは少し珍しいようです。

于 2013-03-08T15:01:34.870 に答える
1

クラスに getter と sett がなくても、クラスの状態を変更できる他のメソッドがクラスにないわけではありません。結局のところ、彼らがクラスにいるのは、クラスがあらゆる種類のタスクを実行するために彼らを必要としているからです. そのため、他のメソッドが責任の一部としてクラスの状態を変更する可能性があります。

たとえば、クラスが銀行口座クラスである場合、おそらく口座の残高を直接設定するメソッドはありませんが、最終的にクラスの状態を内部的に変更する引き出しや預金などのトランザクションを受け入れるメソッドがある可能性があります。

したがって、これは最初から本当に悪い質問です。十分なコンテキストがないと答えが難しいからです。リフレクションはオプションかもしれませんが、セキュリティマネージャーを使用している場合、リフレクションがプライベートフィールドを変更するのを妨げる可能性があるため、これも間違った答えになる可能性があります.

ですから、質問は十分ではなく、文脈がなければ意味がありません。あなたが与えられた詳細に基づいて、おそらく質問への答えは次のような別の質問であるべきでした:

クラスのプライベート フィールドを変更する必要があるのはなぜですか? 結局のところ、彼らは理由があって非公開です。したがって、基本的にそれらを変更する必要がある場合は、座って設計を再考し、クラスに適切なパブリック インターフェイスがないかどうかを判断する必要があります。

その答えによって、インタビュアーはより多くのコンテキストを提供するようになり、適切な答えを提供できるようになります。たとえば、インタビュアーは、クラスがサードパーティ フレームワークの一部であり、そのソース コードを持っていないため、ゲッター/セッター メソッドを提供することはできませんが、いくつかの読み取り/書き込みを余儀なくされていると言うことができます。いくつかの問題を解決するための回避策として、このフレームワークの特定のオブジェクトのプライベート状態。

これで、より多くのコンテキストが得られ、次のような別の質問をすることができます: このアプリケーションでセキュリティ マネージャーを使用していますか? 彼/彼女がノーと言ったら、あなたは言うことができます、その場合、反省はオプションです.....

于 2013-03-08T15:05:32.843 に答える