Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns repl
- (:import (io.lindstrom.m3u8.model MediaSegment MediaSegment$Builder MediaSegmentBuilder))
- (:import (java.lang.invoke MethodHandles MethodType))
- (:import (clojure.asm ClassWriter Opcodes)
- (clojure.asm.commons GeneratorAdapter)))
- (set! *warn-on-reflection* true)
- (defn -visit-method
- ^GeneratorAdapter [^ClassWriter cw access name desc sig ex]
- (GeneratorAdapter.
- (.visitMethod cw access name desc sig ex)
- access name desc))
- (clojure.lang.DynamicClassLoader/.defineClass @clojure.lang.Compiler/LOADER
- "repl.TestFn"
- (.toByteArray
- (doto (ClassWriter. (bit-or ClassWriter/COMPUTE_FRAMES ClassWriter/COMPUTE_MAXS))
- (.visit 52 Opcodes/ACC_PUBLIC "repl/TestFn" nil "clojure/lang/AFn" nil)
- (->
- (-visit-method Opcodes/ACC_PUBLIC "<init>" "()V" nil nil)
- (doto
- (.visitCode)
- (.loadThis)
- (.visitMethodInsn Opcodes/INVOKESPECIAL "clojure/lang/AFn" "<init>" "()V")
- (.returnValue)
- (.endMethod)))
- (-> (-visit-method
- Opcodes/ACC_PUBLIC
- "invoke" "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
- nil nil)
- (doto
- (.visitLdcInsn "foo")
- (.loadArg 0)
- ; no $ no party!
- (.visitTypeInsn Opcodes/CHECKCAST "io/lindstrom/m3u8/model/MediaSegment$Builder")
- (.loadArg 1)
- (.visitTypeInsn Opcodes/CHECKCAST "java/lang/String")
- (.visitMethodInsn Opcodes/INVOKEVIRTUAL
- "io/lindstrom/m3u8/model/MediaSegment$Builder" "uri" "(Ljava/lang/String;)Lio/lindstrom/m3u8/model/MediaSegment$Builder;")
- (.visitInsn Opcodes/ARETURN)
- (.visitEnd)
- (.endMethod)))
- (.visitEnd)))
- nil)
- ((repl.TestFn.) (MediaSegment/builder) "foo")
- (.getMethods MediaSegment$Builder)
- (let [-subinterface-accessor ^[String] io.lindstrom.m3u8.model.MediaSegment$Builder/.uri]
- (try (-subinterface-accessor (MediaSegment/builder) "foo")
- (catch IllegalAccessError e (re-find #"MediaSegment$Builder" (ex-message e)))))
- (defn -invoke-instance-meth [m & args]
- (.invoke ^java.lang.reflect.Method m (first args) (object-array (next args))))
- (-invoke-instance-meth (doto (.getMethod MediaSegmentBuilder
- "uri" (into-array [String]))
- (.setAccessible true))
- (MediaSegment/builder)
- "uri")
- (defn -find-that-method [cls]
- (.findVirtual (MethodHandles/lookup)
- cls "uri"
- (MethodType/methodType ^Class cls ^Class/1 (into-array [String]))))
- (defn -invoke-handle [h & args]
- (java.lang.invoke.MethodHandle/.invokeWithArguments h (object-array args)))
- (-invoke-handle (-find-that-method MediaSegment$Builder) (MediaSegment/builder) "foo")
- (try
- (-find-that-method MediaSegmentBuilder)
- (catch IllegalAccessException _))
Add Comment
Please, Sign In to add comment