2013-05-14 27 views
0

我想知道在Java中调用另一个类中的方法的对象的类型,例如, :在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(); 
    } 
    } 
+2

这使我的心是抛出一个异常,分析堆栈跟踪的唯一的事,但是这将是一个可怕的做法 – 2013-05-14 14:39:05

+0

这是不太可怕,如果只需要简单的例外。你不需要扔掉它。但是,您可以询问当前的线程来替代它的堆栈 – 2013-05-14 14:43:24

+1

为什么你需要知道这个?我对你可能做的事情隐约感到恐惧,而不是通过传递某种枚举标志来完成。您将创建一些非常脆弱,紧密耦合的代码。 – 2013-05-14 15:03:08

回答

4

您可以通过在调用代码的方法时检查堆栈来做到这一点。退房Thread.getStackTrace()并使用当前线程通过

Thread.currentThread() 

返回的你可以以你的方式备份堆栈跟踪阵列,并确定呼叫者的链条。请注意,但是需要注意的文件中:

某些虚拟机可能,在某些情况下,从堆栈跟踪缺少一个或多个 堆栈帧。在极端情况下,虚拟 机器没有关于此线程的堆栈跟踪信息,因此 被允许从此方法返回一个零长度的数组。

如果你需要找出谁调用你的类的子集,我会改变类,它们实现一些Caller/Callee接口,从而实现方法签名:

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

哪里您的呼叫类实施Caller。这样你就可以执行一些相对类型安全的方法调用和参数传递。

+0

那么这些机器应该做什么? – 2013-05-14 14:48:23

+0

这意味着你无法找到谁在这些机器上调用你的代码 – 2013-05-14 15:06:56

2

试试这个:

Thread.currentThread().getStackTrace()