Java 使函数知道是谁调用它的方法
在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
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异常,或者堆栈非常非常深。这两个问题在这里似乎都不相关。说创建异常并不便宜有什么错呢????