0

ミッションインポッシブルのように聞こえる、クレイジーなタスクがあります。メソッドのスタックを介していくつかのデータを渡す必要がありますが、変更することはできません(最後の1つのみを変更できます)。例:

SomeData someData; //not passed in method1
obj1.method1(...);

これがobj1クラスコードです

obj1 {
    someReturnClass method1(...) {
        ...
        obj2.method2(...);
        ...
    }
}

obj2とmethod2は、objN.methodM()に到達する前に、さらにいくつかのメソッドを呼び出します。別のスレッドで実行することもできます(したがって、ThreadLocalは役に立ちません)。このスタックをパラメーターとして渡されないmethodM内のsomeDataにアクセスする必要があります。

例外と二重実行methodMを通過させるためのいくつかの概念がありますが、見た目は醜いです。

someDataをmethodM()に渡す方法について何かアイデアはありますか?

4

3 に答える 3

1

他の方法でアクセスを密輸できない場合(たとえば、呼び出しスタックを通過する他のオブジェクトにへの参照を追加するなど)、最終的にはグローバル変数を使用する必要がありますSomeData。もちろんこれは貧弱な設計ですが、制約を考えると他に何もできません。

コメントで、メソッドを「アクティブ」に何度も呼び出す可能性があると述べました(再帰的ですか、それとも複数のスレッドがありますか?)その場合は、代わりにグローバルコレクションが必要であり、何らかの方法で推測する必要があります。呼び出しスタック通過するデータから選択するコレクションの要素。

于 2012-11-02T15:44:57.140 に答える
0

メソッドのアクティブ化内で、変更できないメソッドのローカル変数にアクセスする必要があることを理解していますが、スタックの下位に存在することがわかっています。

ここで明らかなことは、Javaデバッグアーキテクチャを使用することです:http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html

これにより、すべてのスレッドのスタックを調べることができます。

于 2012-11-02T15:03:20.643 に答える
0

最後に、私は解決策を見つけました:

JAASサブジェクトを作成する

Subject subject = new Subject();

サブジェクトのプリンシパルまたはクレデンシャルのどこかにデータを配置します。

subject.getPublicCredentials().add(new String("Trololo"));

この主題とそれはあなたが必要とするところならどこでもデータを取得します(別のスレッドでも機能します):

Subject subject = Subject.getSubject(AccessController.getContext());
System.out.println(subject.getPublicCredentials());

サブジェクトが作成される前にスレッドが開始された場合にのみ機能します。

于 2012-11-02T15:51:58.480 に答える