3

私は3つのクラスを持っています.. A、B、C。

  1. クラス B と C の両方に、B と C の名前を含む静的文字列変数「name」があります。
 class B
     {
     static name;
     public static void main(String args[])
     {
     name="Class B";
     A.getName();
     }
  1. クラス B と C からクラス A の getName メソッドを呼び出しています。クラス A は次のとおりです。

クラスA {

getName()
{
System.out.println(this class called me);
}
}

クラスCは:

 class C
     {
     static name;
     public static void main(String args[])
     {
     name="Class C";
     A.getName();
     }

ここで私の質問は、クラス A の「このクラスが私を呼び出した」の代わりにどのコードを使用すれば、A を呼び出すクラスの名前を取得できるかということです。私は明確であることを願っています!!

4

4 に答える 4

2

あなたのA.getNameメソッドは、それを呼び出したクラスのコードを知ることができません。その情報をそれに渡す必要があります。

厳密にはそうではありませんが、スタック トレースを生成して調べることで解決できます。しかし、それは非常に悪い考えです。一般に、メソッドが何かを知る必要がある場合は、A) その情報をインスタンス データとして持つインスタンスの一部にするか、B) 情報を引数としてメソッドに渡します。

于 2012-12-29T19:06:16.123 に答える
1
class A {
    getName()
    {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        int lastStackElement = stackTraceElements.length-1;
        String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
        System.out.println(callingObjectsName + " called me.");
    }
}
于 2012-12-29T19:12:15.467 に答える
0
Modify your code to something like this:

class A 
{
   getName(String className) 
   {
      System.out.println(className);
   }
}

and use it like :

 class B
 {
     static name;
     public static void main(String args[])
     {
       name="Class B";
       A.getName(name);
     }
 }
于 2012-12-29T19:15:56.580 に答える
0

あなたが実際にやろうとしているのは、あるスタック フレームから別のスタック フレームに情報を渡すことです。具体的には、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. スタック トレースの取得
  2. それを使用して、スタック トレース配列の要素 1 である呼び出しスタック フレームを取得します。
  3. それを使用して、呼び出し元のメソッドのクラス名を取得します
  4. を使用してオブジェクトClass.forNameを取得するClass<?>
  5. そのオブジェクトを呼び出しgetField("name")てオブジェクトClass<?>を取得するField
  6. Field(オプションですが推奨) が文字列型の静的フィールドを表していることを確認する
  7. を呼び出しget(null)Fieldその値を取得し ( はnullフィールドが必要なオブジェクトを表します。フィールドは静的であり、どのオブジェクトにも関連付けられていないため、この引数は無視されます)、この値を次のようにキャストします。String

または、代わりに次のことができます。

  1. 名前を必要とする関数に名前を渡すだけです。

呼び出し元のインスタンスを取得する方法がないため(呼び出し元のインスタンスのクラスを取得することはできますが) 、アプローチではnameフィールドが静的である必要もあります。がインスタンス フィールドであっても、より単純なアプローチが機能します。name

于 2012-12-29T20:19:22.133 に答える