Zasadniczo mam instrukcja rejestrowania wewnątrz metody. Za każdym razem, gdy wywoływana jest metoda, chcę łatwo wywołać nazwę metody i dołączyć ją do instrukcji rejestrowania. Ma to na celu zminimalizowanie liczby zakodowanych linii w mojej aplikacji. Czy można to zrobić tanio?Czy mogę tanio wywołać metodę Java, aby uzyskać nazwę bieżącej metody?
Odpowiedz
Nie, nie tanio. Jedynym drogim i jedynym sposobem na to jest wywołanie metody StackTrace
. Najlepiej po prostu go zakodować.
Cóż, szkoda. Nie wiem, dlaczego java nie może jeszcze tego zrobić tanio. –
AspectJ został zaprojektowany, aby poradzić sobie z takimi problemami. – antlersoft
Jak używać AspectJ do robienia czegoś takiego? Najbliższa metoda jaką mogę znaleźć to "getSourceMethod()" –
Jeśli potrzebujesz tylko nazwy metody i numeru linii, możesz zrobić to w miarę szybko. W moim mikro odniesienia można zrobić około 120.000 połączeń na sekundę
public class A {
private static final int N = 1000000;
public static void main(String[] args) {
A a = new A();
long l = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
a.test(0);
a.test(1);
a.test(2);
}
double time = (System.currentTimeMillis() - l)/1000d;
System.err.println(time + " seconds");
System.err.println(N/time + " calls/second");
}
String test(int i) {
StackTraceElement ste = Thread.currentThread().getStackTrace()[i];
return ste.getMethodName() + ":" + ste.getLineNumber();
}
}
Zobacz również this answer.
'Test łańcuchowy (int i) { StackTraceElement ste = Thread.currentThread(). getStackTrace() [i]; // String aString = "bleh"; // return aString; powrót ste.getMethodName(); } } 'Pobiegłem testowanie między robi twardą kod i robi StackTrace // Z StackTrace // 30.281 sekund //33024.00845414616 połączeń/sekundę // drugim przejeździe //17.937 sekund // 55750 Połączenia/sekundę // Z twardym ciągiem //0.016 sekund //6.25E7 połączeń/sekunda --- Zasadniczo znaczny 100-krotny wzrost kosztów w porównaniu do powrotu kodu sztywnego – TravMan
Dobrze. Wszystko zależy jednak od tego, jak często ten kod jest wywoływany. Powiedz, jeśli zadzwonisz na nią tylko raz na sekundę, może naprawdę możesz sobie na to pozwolić. –
Co z adnotacją lub czymś, co po prostu nagrywa bieżącą nazwę metody, więc mogę wyciąć wklejkę bez zmieniania głupiego łańcucha w kółko? – ggb667
Dlaczego wyważać otwartych drzwi, java.util.logging.Logger wykorzystuje
/**
* Gets the StackTraceElement of the first class that is not this class.
* That should be the initial caller of a logging method.
* @return caller of the initial logging method or null if unknown.
*/
private StackTraceElement getCallerStackFrame()
{
Throwable t = new Throwable();
StackTraceElement[] stackTrace = t.getStackTrace();
int index = 0;
// skip to stackentries until this class
while(index < stackTrace.length
&& !stackTrace[index].getClassName().equals(getClass().getName()))
index++;
// skip the stackentries of this class
while(index < stackTrace.length
&& stackTrace[index].getClassName().equals(getClass().getName()))
index++;
return index < stackTrace.length ? stackTrace[index] : null;
}
wątpię, otrzymasz go szybciej niż ten.
[Edytuj] Aby uzyskać metodami telefoniczne Nazwa Użyj,
StackTraceElement caller = getCallerStackFrame();
String name = caller != null ? caller.getMethodName() : "<unknown>"
To wykorzystuje StackTrace i wymaga użycia logger Java. To dobrze, jeśli testujesz w małej aplikacji w domu, ale jak na przebieg testu poniżej StackTrace jest 100 razy wolniejszy. – TravMan
@ TravMan Zgadzam się, po prostu poprosił o zewnętrzną metodę, którą mógłby nazwać, która zwróci nazwę metody dzwoniącego, z pominięciem twardego kodowania nazwy (i pozornie [wooo złego]), ta metoda byłaby najszybsza. 100 razy nie ma ramki odniesienia i wyobrażam sobie, że to wszystko jest dyskusyjne i ścigamy czarodziejską mikrooptymalizację. – Andrew
również przegłosowano, nigdy nie używałam takiej klasy Logger – TravMan
pan rozważyć pisanie sensownych wiadomości dziennika zamiast? Mam na myśli wiadomości, które po prostu mówią czytelnikowi, żeby zapisał "historię" o tym, jak działa kod? wiadomości, które naprawdę różnią się dla różnych metod?
log4j: some.package.Class1: method1: checkpoint #1
log4j: some.package.Class1: method1: checkpoint #2
log4j: some.package.Class2: method2: checkpoint #1
log4j: some.package.Class2: method2: checkpoint #2
Uderzyłem głową w dziennik jak powyżej zaledwie tydzień lub dwa lata temu (nazwy metod zostały ustalone na stałe). Nie wydawało się to zauważalnie bardziej pomocne niż brak logowania.
- 1. Jak uzyskać nazwę metody ze znanej metody?
- 2. Użyj JDT, aby uzyskać pełną nazwę metody
- 3. Jak mogę wywołać metodę set_error_handler() dla metody na obiekcie?
- 4. Jak uzyskać nazwę bieżącej funkcji?
- 5. Czy można uzyskać odwołanie do metody Java, aby wywołać ją później?
- 6. Jak uzyskać nazwę bieżącej strony PHP
- 7. Polecenie, aby wywołać metodę z viewmodel
- 8. Jak wywołać metodę klasy abstrakcyjnej w java
- 9. Jak wywołać prywatną metodę statyczną za pomocą refleksji (Java)?
- 10. Jak wywołać metodę python z klasy java?
- 11. Mockito wywołać metodę na parametrem wyśmiewali metody
- 12. Jak mogę wywołać metodę w Objective-C?
- 13. Czy można bezpiecznie wywołać zsynchronizowaną metodę z innej zsynchronizowanej metody?
- 14. Czy można wywołać metodę na typie przekazywanym do metody ogólnej?
- 15. Czy istnieje sposób, aby uzyskać nazwę bieżącej jednostki z pliku dołączanego?
- 16. Java Reflection: Jak mogę uzyskać wszystkie metody getter klasy java i wywołać je
- 17. Jak uzyskać nazwę metody wewnątrz metody node.js
- 18. Jak wywołać statyczną metodę Java z Gradle
- 19. czy możemy wywołać metodę startActivityForResult z adaptera?
- 20. Czy można uzyskać nazwę metody z poziomu metody w PHP?
- 21. Jak wywołać metodę super?
- 22. Java Jak wywołać metodę grand rodziców?
- 23. Jak wywołać metodę prywatną spoza klasy java
- 24. Jak wywołać metodę Java z perl6
- 25. Jak uzyskać nazwę lub podpis aktualnej metody w NSString?
- 26. jak wywołać metodę klasy z innej aplikacjiDomain
- 27. Jak wywołać metodę dynamicznie w eliksirie, podając nazwę modułu i metody?
- 28. Jak mogę wywołać metodę z parametrem out?
- 29. Czy mogę uzyskać numer bieżącej klatki w wideo HTML5?
- 30. Jak wywołać metodę niestatyczną z metody statycznej tej samej klasy?
Nie sądzę, że istnieje dobra metoda, która może być użyta w środowisku wykonawczym do tego, ale prawdopodobnie można opisać metody wymagające tej funkcji, a następnie napisać procesor adnotacji, który zostanie włączony do procesu kompilacji. W środowisku uruchomieniowym działałoby prawie identycznie jak w przypadku twardego kodowania nazwy metody, ale nie musiałbyś w rzeczywistości niczego kodować. –
prawdopodobny duplikat [Uzyskiwanie nazwy obecnej metody wykonywania] (http://stackoverflow.com/questions/442747/getting-nazwa-tworzenia-przeszłego-wykonywania-modelu) – bmargulies