3

我有三个班级.. A,B,C。

  1. 在 B 类和 C 类中,我都有一个静态字符串变量“name”,其中包含 B 和 C 的名称,如-
 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表示 String 类型的静态字段
  7. 调用get(null)Field获取它的值(null代表你想要该字段的对象——因为该字段是静态的,因此不绑定到任何对象,这个参数被忽略),并将这个值转换为String

或者,您可以:

  1. 只需将名称传递给需要它的函数即可。

您的方法还要求该name字段是静态的,因为无法获取调用实例(即使您可以获得调用实例的类)。即使name是实例字段,更简单的方法也有效。

于 2012-12-29T20:19:22.133 回答