我一直在為我的 Java 專案開發一個小型日志記錄/除錯庫。我知道那里已經有很多好的,但我想從自己做一個中學習。
作為該庫的一部分,我希望擁有的一種方法是能夠隨時找出您所在的方法,類似于C 中的__func__。大多數情況下,只需使用 StackTrace 即可找到它,因為您通常只需要方法的名稱(和/或宣告類),但我希望能夠獲得方法作為 java.lang.reflect.Method 的一個實體
最簡單的方法是簡單地做
Method currentMethod = new Object() {}.getClass().getEnclosingMethod();
這會很好,但我無法找到一種方法來做同樣的事情而不在方法本身中創建那個'new Object(){}'。理想情況下,如果我能做一個簡單的
Method currentMethod = _method();
獲得相同的結果,但使用我目前的方法,它只會讓我獲得 _method 本身的方法實體。
有沒有已知的方法來實作這一點?如果沒有那很好,但是有一個很好。
編輯:我收到的很多建議,例如這篇文章,主要提供了為您提供方法名稱的答案。可以使用它(以及以相同方式獲得的類資訊)來查找方法,但前提是所討論的類只有一個具有該名稱的方法。這個不能識別同名但引數不同的方法!
uj5u.com熱心網友回復:
這可以使用StackWalker(從 Java 9 開始)來完成。它沒有直接提供Method但足夠的資訊來創建一個。這里的基本思想可以改進(例如更好的例外):
import java.lang.StackWalker.Option;
import java.lang.StackWalker.StackFrame;
import java.lang.reflect.Method;
public class MethodFinder {
public static Method method() {
return StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).walk(stream ->
stream
.filter(MethodFinder::notThisClass)
.findFirst()
.map(MethodFinder::frameToMethod))
.orElseThrow();
}
private static boolean notThisClass(StackFrame frame) {
return frame.getDeclaringClass() != MethodFinder.class;
}
private static Method frameToMethod(StackFrame frame) {
var cl = frame.getDeclaringClass();
try {
return cl.getDeclaredMethod(frame.getMethodName(), frame.getMethodType().parameterArray());
} catch (NoSuchMethodException | SecurityException ex) {
throw new RuntimeException(ex);
}
}
}
要像Method myself = MethodFinder.method().
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430656.html
上一篇:安裝react-native-vector-icons并在ios上運行podupdate后出現無效的UIAccessibilitys'tablist'錯誤
