Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取当前类对象_Java - Fatal编程技术网

Java 获取当前类对象

Java 获取当前类对象,java,Java,我有三节课。。A、 B,C 在B类和C类中,我都有一个静态字符串变量“name”,它包含B和C的名称,如下所示- 我正在从类B和C调用类A的getName方法。。甲级考试成绩如下: 甲级 { 丙类为: 现在我的问题是,我应该用什么代码来代替类A中的“this class called me”,这样我就可以得到调用A的类的名称!我希望我很清楚!!你的A.getName方法无法知道类的代码调用了它。你必须将这些信息传递给它 好吧,严格来说这不是真的,你可以通过生成一个堆栈跟踪并检查它来找出它。但这是

我有三节课。。A、 B,C

  • 在B类和C类中,我都有一个静态字符串变量“name”,它包含B和C的名称,如下所示-
  • 我正在从类B和C调用类A的getName方法。。甲级考试成绩如下:
  • 甲级 {

    丙类为:


    现在我的问题是,我应该用什么代码来代替类A中的“this class called me”,这样我就可以得到调用A的类的名称!我希望我很清楚!!

    你的
    A.getName
    方法无法知道类的代码调用了它。你必须将这些信息传递给它


    好吧,严格来说这不是真的,你可以通过生成一个堆栈跟踪并检查它来找出它。但这是一个非常糟糕的主意。一般来说,如果一个方法需要知道一些东西,你要么a)使它成为一个实例的一部分,将该信息作为实例数据,要么B)将该信息作为参数传递给它。

    听起来像你真正想做的是把信息从一个堆栈帧传递到另一个堆栈帧,特别是从一个帧a到一个帧B,其中a调用了B。这是一件容易的事情,我认为你设计得太过了

    class A {
        getName()
        {
            StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
            int lastStackElement = stackTraceElements.length-1;
            String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
            System.out.println(callingObjectsName + " called me.");
        }
    }
    
    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”)
    ,以获取
    字段
    对象
  • (可选但推荐)确认
    字段
    表示字符串类型的静态字段
  • 字段上调用
    get(null)
    以获取其值(
    null
    表示需要该字段的对象——由于该字段是静态的,因此不绑定到任何对象,因此忽略此参数),并将此值向下转换为
    String
  • 或者,你可以:

  • 只需将名称传递给需要它的函数

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

    因此,这意味着在类B和类Ci中都定义了thisclasscalledme.name?name,并且希望访问调用DME的名称变量的类。这是all@user975234你知道什么是静态的吗?@user975234:同样,你不能(合理地)获取调用
    a.getName
    函数的代码类的引用。需要这样做是一个设计问题,应该通过修改设计来解决。我建议您提出一个单独的问题,概述实际的最终目标,显示完整但简短的(编译)举例说明您尝试了什么,并询问您哪里出了问题(您几乎肯定希望使用类的实例,而不是静态方法)我想访问调用DME的名称变量的类。仅此而已。我不需要任何堆栈跟踪!!@user975234尝试更新。要访问类名称,您需要检查堆栈跟踪。@Shawn我只提供武器,他们对它们造成的伤害是他们自己的事。J/K这很好!但是你能不能清楚它会造成什么伤害!:P@user975234与其说是代码造成了破坏,还不如说是您如何在需要查找调用类名称的第一时间找到了位置。恕我直言,这就是所谓的代码“气味”,因为有些东西闻起来很怪,所以你面临的问题很可能会用更好的设计来解决。我相信这就是TJ所指的。
     class C
         {
         static name;
         public static void main(String args[])
         {
         name="Class C";
         A.getName();
         }
    
    class A {
        getName()
        {
            StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
            int lastStackElement = stackTraceElements.length-1;
            String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
            System.out.println(callingObjectsName + " called me.");
        }
    }
    
    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);
         }
     }
    
    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);
        }
    }