我正在编写一个带有以下签名的Java方法。
void Logger(Method method,Object [] args);
如果方法(例如ABC())调用此方法Logger,它应该检索封装自身数据的Method对象(ABC())并将其作为参数传递。
方法如何检索存储有关该方法的所有信息的Method对象?
一种简单的方法是我使用 Method [] methods = ExampleClass.Class.getMethods(); 并使用正确的名称在整个数组中搜索Method。 (这是非常低效的)。此外,如果两个或多个方法具有相同的名称,那么我将不得不检索它们的参数类型(以区分它们)并为每个方法使用不同的代码。这既低效又痛苦。
有更好的方法吗?
感谢您的帮助。
答案 0 :(得分:5)
不要这样做。而是从堆栈中获取方法名称。
public void log(Object object) {
String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
// ...
}
然而,这是相当昂贵的,这就是为什么大多数自我尊重的日志框架提供了打开/关闭它的选项(我建议使用它而不是自己生长的)。
答案 1 :(得分:1)
更好的是,根本不要实现此方法。使用logback或其他一些现代日志框架。
答案 2 :(得分:0)
如果您正在编写现有记录器框架的包装器,那么已经提供了一种在日志消息中打印方法名称的方法 - 如果这是您要实现的内容。
你可以从log4j文档中读取,例如,这个提取(如另一个答案所示)是从堆栈跟踪完成的,并且价格昂贵:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html