【问题标题】:way to make a function aware who called it让函数知道谁调用它的方法
【发布时间】:2010-12-14 12:29:01
【问题描述】:

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

所以当MyClassBgetContents() 方法从MyCallingClassOther 调用时,我想要返回不同的东西。

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

这是我正在尝试解决的更大难题的一小部分……显然设计不佳。这有点像hackway。

我还想看看它是如何用其他语言实现的?

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

【问题讨论】:

标签: java


【解决方案1】:

这是一个更大的难题的一小部分 我正在尝试解决...哪个 显然设计得很差。这是 有点像hackway。

可以为所欲为;请参阅@Taylor L 的回答。但请注意,在 Java 中创建异常并不便宜。

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

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

【讨论】:

  • “从长远来看,这样做几乎肯定是个坏主意”——我 100% 同意。只有在调试时才有意义地诉诸这种骇客。
  • 我同意这并不便宜;但是,当这是唯一的方法时,就会出现这种情况。
  • 我同意斯蒂芬的观点,糟糕的设计不应该被黑客掩盖。
  • -1 因为 a) 关于性能的注释,b) 没有提到堆栈跟踪可能实际上是不完整的或空的。
  • @Bombe - 什么?我知道堆栈跟踪不完整的唯一情况是异常是 OutOfMemory 异常还是堆栈非常非常深。这些似乎都不相关。说创建异常并不便宜有什么问题???
【解决方案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");

【讨论】:

  • @Taylor:我稍微更改了您的答案以使其更具表达性。如果您不喜欢它,只需将其回滚。加油!
  • 我敢肯定这行得通,但男孩就是那么不雅。你会认为有一种更简洁的方式来执行这个特定的运行时内省。
  • -1 因为堆栈跟踪可能不完整或为空。详情请见java.sun.com/j2se/1.5.0/docs/api/java/lang/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2022-12-20
  • 2019-09-13
  • 2016-12-16
  • 2016-11-04
  • 2010-11-16
  • 2012-07-16
相关资源
最近更新 更多