Guest User

Untitled

a guest
May 15th, 2026
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. (ns repl
  2. (:import (io.lindstrom.m3u8.model MediaSegment MediaSegment$Builder MediaSegmentBuilder))
  3. (:import (java.lang.invoke MethodHandles MethodType))
  4. (:import (clojure.asm ClassWriter Opcodes)
  5. (clojure.asm.commons GeneratorAdapter)))
  6.  
  7. (set! *warn-on-reflection* true)
  8.  
  9. (defn -visit-method
  10. ^GeneratorAdapter [^ClassWriter cw access name desc sig ex]
  11. (GeneratorAdapter.
  12. (.visitMethod cw access name desc sig ex)
  13. access name desc))
  14.  
  15. (clojure.lang.DynamicClassLoader/.defineClass @clojure.lang.Compiler/LOADER
  16. "repl.TestFn"
  17. (.toByteArray
  18. (doto (ClassWriter. (bit-or ClassWriter/COMPUTE_FRAMES ClassWriter/COMPUTE_MAXS))
  19. (.visit 52 Opcodes/ACC_PUBLIC "repl/TestFn" nil "clojure/lang/AFn" nil)
  20. (->
  21. (-visit-method Opcodes/ACC_PUBLIC "<init>" "()V" nil nil)
  22. (doto
  23. (.visitCode)
  24. (.loadThis)
  25. (.visitMethodInsn Opcodes/INVOKESPECIAL "clojure/lang/AFn" "<init>" "()V")
  26. (.returnValue)
  27. (.endMethod)))
  28. (-> (-visit-method
  29. Opcodes/ACC_PUBLIC
  30. "invoke" "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
  31. nil nil)
  32. (doto
  33. (.visitLdcInsn "foo")
  34. (.loadArg 0)
  35. ; no $ no party!
  36. (.visitTypeInsn Opcodes/CHECKCAST "io/lindstrom/m3u8/model/MediaSegment$Builder")
  37. (.loadArg 1)
  38. (.visitTypeInsn Opcodes/CHECKCAST "java/lang/String")
  39. (.visitMethodInsn Opcodes/INVOKEVIRTUAL
  40. "io/lindstrom/m3u8/model/MediaSegment$Builder" "uri" "(Ljava/lang/String;)Lio/lindstrom/m3u8/model/MediaSegment$Builder;")
  41. (.visitInsn Opcodes/ARETURN)
  42. (.visitEnd)
  43. (.endMethod)))
  44. (.visitEnd)))
  45. nil)
  46.  
  47. ((repl.TestFn.) (MediaSegment/builder) "foo")
  48.  
  49. (.getMethods MediaSegment$Builder)
  50.  
  51. (let [-subinterface-accessor ^[String] io.lindstrom.m3u8.model.MediaSegment$Builder/.uri]
  52. (try (-subinterface-accessor (MediaSegment/builder) "foo")
  53. (catch IllegalAccessError e (re-find #"MediaSegment$Builder" (ex-message e)))))
  54.  
  55. (defn -invoke-instance-meth [m & args]
  56. (.invoke ^java.lang.reflect.Method m (first args) (object-array (next args))))
  57.  
  58. (-invoke-instance-meth (doto (.getMethod MediaSegmentBuilder
  59. "uri" (into-array [String]))
  60. (.setAccessible true))
  61. (MediaSegment/builder)
  62. "uri")
  63.  
  64. (defn -find-that-method [cls]
  65. (.findVirtual (MethodHandles/lookup)
  66. cls "uri"
  67. (MethodType/methodType ^Class cls ^Class/1 (into-array [String]))))
  68.  
  69. (defn -invoke-handle [h & args]
  70. (java.lang.invoke.MethodHandle/.invokeWithArguments h (object-array args)))
  71.  
  72. (-invoke-handle (-find-that-method MediaSegment$Builder) (MediaSegment/builder) "foo")
  73. (try
  74. (-find-that-method MediaSegmentBuilder)
  75. (catch IllegalAccessException _))
  76.  
  77.  
Add Comment
Please, Sign In to add comment