2013-04-10 11 views
8

Clojureの特定の関数に「特別な」タグを付けて、Javaコードがリフレクションを使用してそれらを認識できるようにする必要があります。私は、関数に注釈を追加しようとしましたが、明らかにサポートされていません。私はreifyのインターフェイスをIFnに拡張しようとしましたが(Javaコードが関数オブジェクトを認識できるように)、Clojureはinvokeを実装するコードとして直接的な方法を直接使用するのではなく、 Afunction実際にメソッドを実装しているオブジェクト(実際のファンクションコードで実際のinvokeメソッドにタグを付ける必要があります)。Clojure関数にタグ付けをして、Javaのリフレクションで認識できるようにする方法

アイデア?

EDIT:(正反射ではなく)ASMライブラリでアクセスできる方法でタグ付けすることもできますが、実際にはAFunctionオブジェクトまたはinvokeメソッドにタグを付ける必要があります。また、私は実際のAFunctionオブジェクトにアクセスすることはできません - 私はクラスで表示されるタグが必要です。あなたは、メタデータ(マップ)(IObjがIMetaを拡張し、すべてがIObjを拡張オブジェクトとしてすべてのオブジェクトであることが判明)IMetaインターフェースを実装するオブジェクトに付加されることを可能にするClojureのメタデータ機能を使用することができ

答えて

3

2つのオプションがあります。

1)あなたはハローあなたがVARを手に入れる

(defn hello {:name "hello"} [] 10) 

とJava側に)実際のIFNオブジェクトへのvarポイント(VARにメタデータを添付してもらうためにIMetaメソッドを使用することができます特定のメタデータが存在するかどうかを検出します。 この問題は、あなたのJavaコードが、vars(例:匿名関数)ではなくIFnオブジェクトに直接アクセス/処理することがあり、これを解決するには2番目のオプションを試してください。

2)関数オブジェクト自体にメタデータを添付:

(def hello (with-meta (fn [] 10) {:name "hello"})) 

ことがVARにメタデータを添付してあなたがdefnを使用することはできません。上記のサンプルコードは、メタデータを関数オブジェクト自体に添付しています。 Java側では、関数オブジェクトをIMetaにタイプし、チェックを行います。 上記のコードは、少し練習として残っているマクロの助けを借りてdefn好きになるかもしれません:)

+0

ありがとうございます!残念ながら、IFnオブジェクト自体にアクセスすることさえできません。そのクラスにしかアクセスできません。私は何とかクラスにタグを付ける必要があります(特定の情報を添付する必要はなく、クラスが何らかの形で「マーク」されているかどうかを判断するための手段です)。私はそれを呼び出すメソッドは、よく知られているチェック例外をスローすることを指定することによってそれをタグ付けすると思ったが、私はClojureからそのことを知っている方法はありません。 – pron

+0

clojureとjavaのサンプルコードを提供して、clojureのクラスが作成され、Javaからアクセスされる方法を示すことができます。これにより、質問がより明確になります。 – Ankur

+0

私はJavaAgentを使用していくつかのクラスを実装します。新しいクラスがロードされたときに通知されます。私は何とかClojure関数にタグを付けて、計測が必要かどうかを知るようにしたいと思います。 – pron

0

ローカル定義を含むletステートメントで関数本体を囲むと、変数名は、クラスファイルのメソッドのローカルテーブルに表示されます。しかし、ちょっと面倒です。それでももっと良い方法を探しています。

関連する問題