I think in this case you should be able to use proxy, maybe.
user=> (defn attribute-list [map] (proxy [javax.swing.text.AttributeSet] []
(getAttribute [k] (get map k))))
user=> (.getAttribute (attribute-list {:a 1 :b 2}) :a)
1
There's also defrecord:
(defrecord foo [my basis keys]
the.JavaInterface
(javaIfaceMethod [this foo] ...))
which will work in the specific case that you want "a Clojure map that
implements a particular Java interface". Records behave partially as
Clojure maps. For more general mixins, proxy, reify, and deftype are
your friends, and even gen-class may be needed in some instances.