Java 使函数知道是谁调用它的方法

Java 使函数知道是谁调用它的方法,java,Java,在java中,有没有可能让一个方法知道是谁调用了它(而不改变参数),然后返回其他东西 public class MyClassA { public static final String someStirng = "this is some String" public String getSomeString () { return someString; } } public class MyClassB extends MyClassA { p

在java中,有没有可能让一个方法知道是谁调用了它(而不改变参数),然后返回其他东西

public class MyClassA {
   public static final String someStirng = "this is some String"
   public String getSomeString ()
   {
     return someString;
   } 
}

public class MyClassB extends MyClassA {
    public static final String otherstring = "This is other string"
    public SomeBean getContents()
    {
      SomeBean s = new someBean();
      //if this method gets called from MyCallingClassOther then 
      // i want s.setContents(otherstring)
      s.setContents(getSomeString()); 
      return s;
    }
}

public class MyCallingClass {
    public String callingclassContents ()
    {
      MyClassB myb = new MyClassB();
      return ((SomeBean)myb.getContents()).getFirstName();
    }
}

public class MyCallingClassOther {
    public String callingOtherContents ()
    {
       MyClassB myb = new MyclassB();
       return ((SomeBean)myb.getContents()).getFirstName();
    }
}
因此,当从
MyCallingClassOther
调用
MyClassB
getContents()
方法时,我希望返回不同的内容

我唯一可以更改的代码是
getContents()
(不能更改参数)的主体。或者我可以在
MyCallingClassOther
中更改
callingOtherContents()的主体

这是我试图解决的一个更大难题中的一小部分…显然设计得很糟糕。这是一种黑客方式

另外,我想看看在其他语言中是如何实现的


如果您想知道为什么我不能更改参数…那是因为我不想更改
MyCallingClass的
callingclassContents()
中的任何内容,这将为您提供有关调用方的信息。“1”将根据需要更改,具体取决于您要查询的级别数

StackTraceElement aParentStack = new Throwable().fillInStackTrace().getStackTrace()[1];
System.out.println(aParentStack.getClassName());
System.out.println(aParentStack.getFileName());
System.out.println(aParentStack.getLineNumber());
System.out.println(aParentStack.getMethodName());
System.out.println((aParentStack.isNativeMethod() ? "Native" : "Java") + " method");
这是一个更大的谜题的一小部分 我正在努力解决…哪个 显然,它的设计很差。这是 有点老套

你可以做你想做的事;见@Taylor L的答案。但是请注意,在Java中创建异常并不便宜


但我的主要观点是,从长远来看,这样做几乎肯定是个坏主意。这种诡计使你的代码更难理解,并且给后面的人留下了各种各样的小人物陷阱


在我看来,您最好更改方法API和调用它的代码,以便调用方(实际上)了解行为差异。简言之,修复这个糟糕的设计,不要让它变得更糟。

@Taylor:我稍微改变一下你的答案,让它更具表达力。如果你不喜欢,就把它滚回去。欢呼我相信这很管用,但那个男孩就是那个样不雅。您可能认为有一种更干净的方法来执行这个特定的运行时自省。-1因为堆栈跟踪可能不完整或为空。详情请参阅。这是“从长远来看,这样做几乎肯定是个坏主意”的翻版——我100%同意。使用这种黑客手段唯一有意义的是进行调试;然而,在这种情况下,这是唯一的方法。我同意stephen的观点,糟糕的设计不应该被黑客掩盖。-1因为a)关于性能的注释,b)没有提到堆栈跟踪实际上可能是不完整或空的。@Bombe-什么?我所知道的stacktrace不完整的唯一情况是,异常是OutOfMemory异常,或者堆栈非常非常深。这两个问题在这里似乎都不相关。说创建异常并不便宜有什么错呢????