Clojureの特定の関数に「特別な」タグを付けて、Javaコードがリフレクションを使用してそれらを認識できるようにする必要があります。私は、関数に注釈を追加しようとしましたが、明らかにサポートされていません。私はreify
のインターフェイスをIFn
に拡張しようとしましたが(Javaコードが関数オブジェクトを認識できるように)、Clojureはinvoke
を実装するコードとして直接的な方法を直接使用するのではなく、 Afunction
実際にメソッドを実装しているオブジェクト(実際のファンクションコードで実際のinvoke
メソッドにタグを付ける必要があります)。Clojure関数にタグ付けをして、Javaのリフレクションで認識できるようにする方法
アイデア?
EDIT:(正反射ではなく)ASMライブラリでアクセスできる方法でタグ付けすることもできますが、実際にはAFunction
オブジェクトまたはinvoke
メソッドにタグを付ける必要があります。また、私は実際のAFunction
オブジェクトにアクセスすることはできません - 私はクラスで表示されるタグが必要です。あなたは、メタデータ(マップ)(IObjがIMetaを拡張し、すべてがIObjを拡張オブジェクトとしてすべてのオブジェクトであることが判明)IMeta
インターフェースを実装するオブジェクトに付加されることを可能にするClojureのメタデータ機能を使用することができ
ありがとうございます!残念ながら、IFnオブジェクト自体にアクセスすることさえできません。そのクラスにしかアクセスできません。私は何とかクラスにタグを付ける必要があります(特定の情報を添付する必要はなく、クラスが何らかの形で「マーク」されているかどうかを判断するための手段です)。私はそれを呼び出すメソッドは、よく知られているチェック例外をスローすることを指定することによってそれをタグ付けすると思ったが、私はClojureからそのことを知っている方法はありません。 – pron
clojureとjavaのサンプルコードを提供して、clojureのクラスが作成され、Javaからアクセスされる方法を示すことができます。これにより、質問がより明確になります。 – Ankur
私はJavaAgentを使用していくつかのクラスを実装します。新しいクラスがロードされたときに通知されます。私は何とかClojure関数にタグを付けて、計測が必要かどうかを知るようにしたいと思います。 – pron