After some investigation, the before-the-arglist syntax only seems useful for defining fn's that return primitive types.
They don't seem to help resolve reflection calls.
(require '[clojure.tools.analyzer :refer [ast]])
; this creates a double-emitting fn
(ast (fn (^double [^double a] a)))
; =>
;{:op :fn-expr,
; ...
; :methods
; ({:op :fn-method,
; ...
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type D>}), ;double return type here
; ...
; :tag nil} ; no tag
; this creates a regular old fn
(ast (fn (^String [a] 1)))
; =>
;{:op :fn-expr,
; ...
; ({:op :fn-method,
; ...
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type Ljava/lang/Object;>}), ;object return type
; ...
; :tag nil} ; no tag
; this creates a String-hinted fn
(ast ^String (fn a [a] 1))
;{:op :meta,
; ...
; :expr
; {:op :fn-expr,
; ...
; :methods
; ({:op :fn-method,
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type Ljava/lang/Object;>}),
; ...
; :tag String}}
I don't see where before-the-arglist is useful outside of primitive fns.