Pracuję nad własną implementacją maszyny JVM i zapoznałem się z instrukcją checkcast
. Pełna dokumentacja to on this page. Jestem ciekawy, ponieważ podczas wyliczania reguł działania rzutowania, jednym z sprawdzanych warunków jest to, czy sprawdzany odnośnik obiektu ma typ interfejsu. Według mojego zrozumienia nie powinno to być możliwe; interfejsów nie można bezpośrednio utworzyć, a każdy obiekt implementujący interfejs ma inny konkretny typ klasy. Czy czegoś brakuje?Zamieszanie instrukcji check bytecode?
Odpowiedz
Wydaje się, że nie jesteś jedyną osobą, zna tej definicji tego blogu ma wyjaśnienie: http://mbravenboer.blogspot.com/2008/12/why-jvm-spec-defines-checkcast-for.html
Okazuje się, że jest to rzeczywiście niemożliwe `” przypadek. Powodem, dla którego ten element jest w opisie jest dlatego checkcast rekurencyjnie zdefiniowane dla tablic:
- Jeśli S klasy reprezentującą typ tablicy SC [], to znaczy szereg elementów typu SC a następnie:
- ...
- Jeżeli T jest macierzowych TC [], to znaczy szereg elementów typu TC, a następnie jeden z następujących muszą być spełnione:
- ...
- TC i SC są typami odniesienia, a typ SC może b e rzucaj do TC przez rekurencyjne stosowanie tych reguł.
Tak więc, jeśli masz obiekt typu listy [], który jest rzutowany na [], a następnie zasady checkcast powołuje się rekurencyjnie dla typów S = list i T = Kolekcja Kolekcja. Zauważ, że List jest interfejsem, ale obiekt może mieć typ List [] w czasie wykonywania. Jeśli nie zweryfikowałeś tego z opiekunami specyfikacji JVM, ale z tego co widzę, jest to jedyny powód, dla którego istnieje reguła dotycząca typów interfejsów.
Jeśli S typu interfejsu, a następnie:
Jeżeli T jest typu klasy, należy T będzie obiektu (§2.4.7).
Jeśli T jest typem interfejsu, to T musi być tym samym interfejsem co S lub superinterfejsem S (§2.13.2).
Wydaje mi się to oczywiste: interfejs można rzutować na interfejs, który został przedłużony. Ten przypadek jest używany na przykład, gdy wywołujesz serializację w DataInputStream: interfejs DataInputStream implementuje Serializable, więc rzutujemy obiekt na Serializable, nawet nie wiedząc, jaka jest klasa zaimplementowana obiektu.
Myślę, że nie rozumiesz pytania. Ponadto [java.io.DataInputStream] (https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html) jest klasą, a nie interfejsem. –
- 1. Czy istnieje edytor instrukcji klasy plików klasycznych/bytecode?
- 2. erlang BEAM bytecode
- 3. Optymalizacja kompilacji: Java bytecode
- 4. modyfikowanie python bytecode
- 5. Decompiling obfuscated java bytecode
- 6. JavaScript jako debuggable bytecode
- 7. Java Bytecode DUP
- 8. Szablony instancji zamieszanie
- 9. tk messagebox import zamieszanie
- 10. Znajomi zamieszanie
- 11. zamieszanie hexdump
- 12. Tuple == Zamieszanie
- 13. WM_KEYDOWN zamieszanie
- 14. zamieszanie snprintf
- 15. Drukuj zamieszanie
- 16. BeanPostProcessor zamieszanie
- 17. zamieszanie pygame.time.set_timer?
- 18. Proxy Check in python
- 19. Java style check, MagicNumberCheck
- 20. Java ParseInt Sanity Check
- 21. bash check mysql connect
- 22. Ograniczenia MySQL i Check
- 23. PHP Check Process ID
- 24. Generic mod_rewrite referrer check
- 25. Java ASM Bytecode Modyfikacja - Zmienianie ciał metodowych
- 26. Backbone to zamieszanie
- 27. Scala classloaders zamieszanie
- 28. Kolba zamieszanie z aplikacji
- 29. ghci - domyślne zamieszanie
- 30. rodzajowych zamieszanie: oszukują kompilator
Dziękuję bardzo! Właśnie takiej odpowiedzi szukałem. – templatetypedef
+1 Brilliant. :) – biziclop