【问题标题】:Java / Eclipse - macro to specify current method name?Java / Eclipse - 指定当前方法名称的宏?
【发布时间】:2013-05-24 18:45:49
【问题描述】:

我正在使用 eclipse,并希望有一个“宏”,预处理器将在编译之前将其替换为当前方法的名称。

我有一个错误报告函数,称为:reportthis(String errormessage) - 整个应用程序中的不同函数都有 try/catch 块,在发生错误时从 catch 块调用 reportthis(...)。

我希望能够指定类似reportthis(MACRO_CURRENT_METHOD_NAME + ":" + e.ToString()); 的内容 - 其中MACRO_CURRENT_METHOD_NAME 将在编译之前由 Eclipse 进行预处理,并生成 catch {} 块调用 reportthis() 的方法的名称。

所以如果 catch{} 块发生在 main() 中,宏应该返回字符串“main”(或“main()”等)。

这可能吗?我该如何实现我的目标?

谢谢!

编辑 我希望通过 Eclipse 中的预处理器来完成这项工作——这些是不可能的吗?是否有可能为 Eclipse 编写一个插件来用当前函数名替换所有出现的“MACRO_CURRENT_METHOD_NAME”?

【问题讨论】:

    标签: eclipse blackberry java-me


    【解决方案1】:

    我还没有找到自动执行此操作的方法,因此手动添加了一个字符串文字,用于在每次调用日志记录代码时指示调用者的名称。

    Nokia 的 S40 平台也是基于 Java-ME,我知道一些 Nokia S40 开发人员很好地利用了Jarrut, which is available on Sourceforge,,通过修改跟踪堆栈的程序来产生堆栈跟踪。您可以利用此功能在日志记录代码中获取调用函数名称,但您可能需要稍微修改 Jarrut 以使其正常工作。

    【讨论】:

      【解决方案2】:

      Java 不支持宏。 但是你可以做些什么来确定当前的方法是这样的

        final StackTraceElement aTop = Thread.currentThread ().getStackTrace ()[1];
        System.out.println (aTop.getMethodName ());
      

      通过使用索引 [1] 处的元素,您可以获得调用方法,因为 [0] 处的元素是 Thread.getStackTrace()。 如果您将此代码包装在其他方法中,则必须采用数组索引,例如到 2,具体取决于您使用的包装方法的数量。

      【讨论】:

      • 作为对 Durandal 的回应,这是一个黑莓应用程序,它没有 getStackTrace(),所以很遗憾,这在那儿是不可能的。
      • 不如看看stackoverflow.com/questions/4389758/… 并点击链接 :)
      • 我不想使用事件日志。它使它变得更加复杂并且可能无法在 IRL 中工作
      • 比我放弃。也许您可以编辑问题并将黑莓放在最上面...
      • 已编辑...请看,有没有办法从 Eclipse 中解决它?例如通过编写一个 Eclipse 插件/预处理器
      【解决方案3】:

      java 中没有预处理器,也没有宏语言。

      虽然在某些情况下可能有用,但如果我理解你的问题,它完全没有意义,因为异常的堆栈跟踪已经包含类和方法发生异常的地方。

      不要将字符串传递给您的“reportthis()”,而是创建一个仅接受异常并打印它的签名(或仅编写 e.printStackTrace())。

      【讨论】:

      • 我正在开发一个黑莓应用程序......所以将堆栈跟踪打印到 stdout/err 将无济于事 - reportthis() 将向服务器报告错误(在调试模式下运行时) - 而现在我可以手动将它用作'reportthis("main():" + e.ToString());',我希望看到比手动为每个 catch{} 块执行此操作更好的方法。
      • 然后将异常打印到reportthis() 中的另一个目标。 printStackTrace() 有一个带有 PrintStream 的签名,只有您的想象力才是您可以打印到的极限。你为什么要自愿从堆栈跟踪中丢弃所有有用的信息?
      • “有一个 printStackTrace() 的签名需要一个 PrintStream”是什么意思?我唯一可用的 printStackTrace() 打印到 stderr
      • 我明白了,可惜黑莓不支持基本的运行时方法。看起来你被搞砸了,你可能会再次恐慌。
      • 其实黑莓插件的Java构建工具确实支持有限的预处理指令but does not support macros,这正是本题所需要的。
      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 2011-01-04
      • 2016-03-13
      • 1970-01-01
      • 2019-11-10
      • 2013-03-07
      • 2010-10-01
      • 2010-09-19
      相关资源
      最近更新 更多