我正在使用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”?
答案 0 :(得分:2)
我没有找到一种自动执行此操作的方法,因此手动添加了一个字符串文字,指示每次调用日志代码时调用者的名称。
诺基亚的S40平台也基于Java-ME,我知道一些诺基亚S40开发人员已经很好地利用Jarrut, which is available on Sourceforge,通过修改程序来跟踪堆栈来产生堆栈跟踪。您可以利用此功能在日志记录代码中获取调用函数名称,但您可能需要稍微修改Jarrut才能使其工作。
答案 1 :(得分:1)
Java不支持宏。 但是你可以做些什么来确定当前的方法就像
final StackTraceElement aTop = Thread.currentThread ().getStackTrace ()[1];
System.out.println (aTop.getMethodName ());
通过使用index [1]处的元素,您将获得调用方法,因为[0]处的元素是Thread.getStackTrace()。 如果将此代码包装在另一个方法中,则必须采用数组索引,例如到2,取决于您使用的包装方法的数量。
答案 2 :(得分:0)
java中没有预处理器,也没有宏语言。
虽然有些情况下可能有用,但如果我理解您的问题则完全没有意义,因为异常的堆栈跟踪已经包含类和方法发生豁免的地方。
不要将String传递给“reportthis()”,而是创建一个只接受异常并打印它的签名(或者只写e.printStackTrace())。