Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Oop_Class - Fatal编程技术网

查找在Java中调用方法的类的类型

查找在Java中调用方法的类的类型,java,oop,class,Java,Oop,Class,我想知道在Java中调用另一个类中的方法的对象的类型,例如: class A{ public A(){ //.. } public void method1{ //here I'd like to find what's the type of the object which is calling this method } } class B{ public B(){ A a = new A(); a

我想知道在Java中调用另一个类中的方法的对象的类型,例如:

 class A{
   public A(){
     //..
   }
   public void method1{
      //here I'd like to find what's the type of the object which is calling this method 
   }
  }

  class B{
    public B(){
      A a = new A();
      a.method1();
     }
   }

  class C{
     public C(){
        A a = new A();
        a.method1();
     }
   }

您可以通过在调用代码的方法时检查堆栈来实现这一点。签出并使用返回的当前线程

Thread.currentThread()
您可以按自己的方式备份堆栈跟踪数组并确定调用方链。但是,请注意文档中的警告:

在某些情况下,某些虚拟机可能会省略一个或多个虚拟机 从堆栈跟踪中堆栈帧。在极端情况下,虚拟环境 没有关于此线程的堆栈跟踪信息的计算机是 允许从此方法返回零长度数组

如果您需要找出是谁调用了您的类的子集,我会更改这些类,使它们实现一些
调用方
/
被调用方
接口,并实现方法签名,因此:

public void doSomething(..., Caller caller);

调用类在其中实现调用方。通过这种方式,您可以强制执行一些相对类型安全的方法调用和参数传递。

您可以在对代码进行方法调用时检查堆栈。签出并使用返回的当前线程

Thread.currentThread()
您可以按自己的方式备份堆栈跟踪数组并确定调用方链。但是,请注意文档中的警告:

在某些情况下,某些虚拟机可能会省略一个或多个虚拟机 从堆栈跟踪中堆栈帧。在极端情况下,虚拟环境 没有关于此线程的堆栈跟踪信息的计算机是 允许从此方法返回零长度数组

如果您需要找出是谁调用了您的类的子集,我会更改这些类,使它们实现一些
调用方
/
被调用方
接口,并实现方法签名,因此:

public void doSomething(..., Caller caller);
调用类在其中实现调用方。这样,您就可以强制执行一些相对类型安全的方法调用和参数传递。

尝试以下方法:

Thread.currentThread().getStackTrace()
试试这个:

Thread.currentThread().getStackTrace()

我唯一想到的是抛出一个异常并分析stacktrace,但那将是一个可怕的实践如果你只是实例化异常,它就不那么可怕了。你不需要扔它。但是您可以询问当前线程的堆栈,而不是为什么需要知道这一点?我对您可能正在做的事情感到有点恐惧,这些事情不能通过传递某种枚举标志来实现。您将创建一些非常脆弱、紧密耦合的代码。枚举标志?为什么不在方法参数中传递对调用类的引用呢?既然您事先不知道输入参数的类,那么如何在方法参数中定义它呢?我想到的唯一一件事就是抛出一个异常并分析stacktrace,但是,这将是一个可怕的实践,如果您只是实例化异常,它就不那么可怕了。你不需要扔它。但是您可以询问当前线程的堆栈,而不是为什么需要知道这一点?我对您可能正在做的事情感到有点恐惧,这些事情不能通过传递某种枚举标志来实现。您将创建一些非常脆弱、紧密耦合的代码。枚举标志?为什么不在方法参数中传递对调用类的引用呢?那么,既然您事先不知道该输入参数的类,那么如何在方法参数中定义它呢?那么在这些机器上应该做些什么呢?这意味着您无法找出是谁在这些机器上调用了您的代码,那么在这些机器上应该做些什么呢机器?这意味着你无法找出是谁在这些机器上调用了你的代码