让函数知道谁调用它的方法

时间:2009-11-09 04:23:23

标签: java

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();
    }
}

所以当getContents()的{​​{1}}方法从MyClassB调用时,我想要返回一个不同的东西。

只有我可以更改的代码是MyCallingClassOther的主体(无法更改参数)。或者我可以在getContents()中更改callingOtherContents()的正文。

这是我试图解决的一个更大的难题的一小部分......显然设计得很差。这是一种hackway。

另外,我想看看其他一些语言是如何实现的?

如果您想知道为什么我无法更改参数......那是因为我不想更改MyCallingClassOther callingclassContents()中的任何内容

2 个答案:

答案 0 :(得分:5)

  

这是一个更大拼图的小块   我想解决......哪个   显然设计得很差。这是   一种hackway。

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

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

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

答案 1 :(得分:2)

这将为您提供有关来电者的信息。根据您想要查询的级别数量,“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");