(defmulti java-fn (fn [klass f] klass))

(let [scan-results (-> (io.github.classgraph.ClassGraph.)
                       ;; (.verbose)
                       (.enableAllInfo)
                       (.enableSystemJarsAndModules)
                       (.acceptPackages (into-array String ["java.util.function"]))
                       (.scan))]
  (doseq [info (.getAllInterfaces scan-results)
          :let [klass (.loadClass info)]]
    (eval `(import ~(symbol (.getName klass))))
    (.addMethod java-fn
                klass
                (eval
                 `(fn [~'_ ~'f]
                    (reify
                      ~(symbol (.getName info))
                      ~@(for [m (.getDeclaredMethods klass)
                              :when (java.lang.reflect.Modifier/isPublic (.getModifiers m))
                              :when (java.lang.reflect.Modifier/isAbstract (.getModifiers m))
                              :let [argv (count (.getParameters m))
                                    args (repeatedly argv gensym)]]
                          `(~(symbol (.getName m))
                            [~'this ~@args]
                            (~'f ~@args)))))))))

Generated At 2022-12-14T11:55:26-0800 original