Zastanawiam się, dlaczego wyjątek w następujący kod bajtowy (używane do throw Exception) jest powielony.Java Bytecode DUP
Odpowiedz
będę analizować ten wiersz po wierszu gdzie [] = new stos potem op służy:
- NEW stawia nowy
IllegalArgumentException
na stosie [SomeIllegalArgumentException] - DUP duplikaty to [SomeIllegalArgumentException, SomeIllegalArgumentException]
- INVOKESPECIAL wyskakuje off Top One i inicjuje go nazywając to <startowych> metoda [SomeIllegalArgumentException] (Metoda startowy nie zwróci obiekt, aby umieścić z powrotem na stos, więc obiekt musi najpierw zostać powielony tak aby utrzymać go na stosie)
- ATHROW Zgłasza druga (duplikat wyłączyć jedną my zainicjowany) []
Jest to łatwiejsze do zrozumienia, jeśli mniej myślisz o poppingu i przesuwaniu obiektów na stosie, a zamiast tego o referencjach. – oldrinb
W kodzie bajtowym obiekt jest najpierw tworzony przez klasę, a następnie wywoływany jest konstruktor na tym obiekcie. Podpis konstruktora kończy się V
dla void
, ponieważ zwraca wszystko. Oznacza to, że kopia oryginalnego odniesienia do obiektu musi być przechowywana na stosie (lub w zmiennej), aby można go było wywołać po wywołaniu konstruktora.
BTW Wewnętrzna nazwa konstruktora jest <init>
i wewnętrzna nazwa dla statycznego kodu initialiser jest <clinit>
To ma sens, dzięki! – LanguagesNamedAfterCofee
- 1. Optymalizacja kompilacji: Java bytecode
- 2. Decompiling obfuscated java bytecode
- 3. Java ASM Bytecode Modyfikacja - Zmienianie ciał metodowych
- 4. erlang BEAM bytecode
- 5. modyfikowanie python bytecode
- 6. JavaScript jako debuggable bytecode
- 7. Zamieszanie instrukcji check bytecode?
- 8. optymalizator statyczny java bytecode (jak proguard) z analizą ucieczki?
- 9. Co oznacza "dup (?)" W TASM?
- 10. Dlaczego DUP podczas tworzenia nowej instancji
- 11. Jak skonwertować jvm bytecode do js w cljs kompilacji
- 12. Czy istnieje edytor instrukcji klasy plików klasycznych/bytecode?
- 13. mongodb impossible (?) E11000 duplikat key error dup key podczas wstawiania
- 14. Kiedy używać dup i kiedy używać klonu w Ruby?
- 15. Eclipse: Error (Bytecode Outline) SOURCE FILE [w PROJEKCIE] nie znajduje się na ścieżce budowania projektu
- 16. Czy możemy użyć javaca jdk7 do kompilacji kodu z funkcjami java7 do jav6 bytecode
- 17. Aktualizacja Maven resetuje wersję Java
- 18. Wbudowana aplikacja do tworzenia kopii zapasowych Ubuntu 16.04 (Deja-Dup) nie będzie działać.
- 19. Którą metodę należy zdefiniować w klasie Ruby, aby zapewnić dup/clone dla jej instancji?
- 20. Czy kod Java jest kompatybilny z bajtami w ramach różnych aktualizacji tej samej wersji Java?
- 21. Tricky try-catch kod Java
- 22. Różnice w bajtach kodu Java opracowane przez kompilatory Oracle i Eclipse:
- 23. kolekcja java java
- 24. Specyfikacja wyjątku java java ...?
- 25. Czy javap może pokazywać oryginalne linie kodu kodu przeplatane z bajteksem takim jak objdump -S?
- 26. Jak działa kompilator Groovy?
- 27. Czy reaguje natywna kompilacja JavaScript na Javę dla Androida?
- 28. Java Sockets: Socket.close() kończy się inaczej w systemach Windows i Mac?
- 29. Java rozpoczyna inną aplikację Java
- 30. Aktualizowanie pliku właściwości java java
po prostu dodać swoje trzy grosze. 'NEW' po prostu przydziela pamięć obiektu bez wywoływania jakiegokolwiek konstruktora,' INVOKESPECIAL' wywoła konstrukcję, ale wywołanie będzie wyskakiwane ze stosu 'this' wskaźnik i nie będzie wciskane nic (konstruktorzy zwracają' void'). Konwencjonalne kompilatory ukierunkowane na JVM będą generować sekwencję 'NEW/DUP/INVOKESPECIAL' w celu utworzenia nowego obiektu. Jest to wzór rozpoznawany przez JVM i może być specjalnie zoptymalizowany ... – csharpfolk