获取当前的类对象

时间:2012-12-29 19:05:09

标签: java

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

  1. 在B和C类中,我有一个静态字符串变量“name”,其中包含B和C的名称,如 -
  2.  class B
         {
         static name;
         public static void main(String args[])
         {
         name="Class B";
         A.getName();
         }
    
    1. 我从类B和C调用A类的getName方法.A类如下:
    2.   

      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 个答案:

答案 0 :(得分:2)

您的A.getName方法无法知道哪个类的代码称之为它。你必须将这些信息传递给它。

好的,所以不是严格正确的,你可以通过生成堆栈跟踪并检查它来弄明白。但这将是一个非常糟糕的主意。通常,如果某个方法需要知道某些内容,您可以A)将其作为实例数据的实例的一部分,或者B)将信息作为参数传递给它。

答案 1 :(得分: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.");
    }
}

答案 2 :(得分: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);
     }
 }

答案 3 :(得分: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
  8. 或者,你可以:

    1. 只需将名称传递给需要它的函数。
    2. 您的方法还要求name字段是静态的,因为无法获取调用实例(即使您可以获取调用实例的类)。即使name是实例字段,更简单的方法也适用。