あなたが実際にやろうとしているのは、あるスタック フレームから別のスタック フレームに情報を渡すことです。具体的には、A が B を呼び出したフレーム A からフレーム B に情報を渡すことです。これは簡単なことです。私はあなたがそれを過剰に設計していると思います。
public class B {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class C {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class A {
public static void getName(String name) {
System.out.println(name);
}
}
あなたのアプローチには次のものが必要です。
- スタック トレースの取得
- それを使用して、スタック トレース配列の要素 1 である呼び出しスタック フレームを取得します。
- それを使用して、呼び出し元のメソッドのクラス名を取得します
- を使用してオブジェクト
Class.forNameを取得するClass<?>
- そのオブジェクトを呼び出し
getField("name")てオブジェクトClass<?>を取得するField
Field(オプションですが推奨) が文字列型の静的フィールドを表していることを確認する
- を呼び出し
get(null)てFieldその値を取得し ( はnullフィールドが必要なオブジェクトを表します。フィールドは静的であり、どのオブジェクトにも関連付けられていないため、この引数は無視されます)、この値を次のようにキャストします。String
または、代わりに次のことができます。
- 名前を必要とする関数に名前を渡すだけです。
呼び出し元のインスタンスを取得する方法がないため(呼び出し元のインスタンスのクラスを取得することはできますが) 、アプローチではnameフィールドが静的である必要もあります。がインスタンス フィールドであっても、より単純なアプローチが機能します。name