問題タブ [reflections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1618 参照

playframework - Playフレームワーク-PRODモードでも、Playに.classファイルを強制的に生成させることは可能ですか?

Playアプリケーションでは、Reflections(http://code.google.com/p/reflections/)を使用して、特定の注釈で注釈が付けられたいくつかのフィールドを取得します。

リフレクションでは、インデックスを作成するために.classファイルにアクセスできる必要があります。DEVモードでは、Playがtmp / classesに.classファイルを生成するため、うまく機能します。ただし、PRODモードでは、Playはデフォルトでこれらの.classファイルを生成しません。したがって、私のアプリケーションは機能しません!

PRODモードでも、Playに.classファイルを強制的に生成させる方法はありますか?

0 投票する
1 に答える
1327 参照

java - Jarファイル内のGuiceとReflections

Google Guice (3.0) と Google Reflections (0.9.6) を試しています。

次のファイルがあります。

操作.java:

Addition.java:

その他のさまざまな「操作」クラスは、複数のパッケージにまたがっています。

CalculatorModule.java:

電卓.java:

最後に、App.java:

IntelliJ 内でApp.javaを実行すると、予想どおり、次の出力が得られます。

電卓: 3 3
モジュラス: 0
除算: 1
乗算: 9
足し算: 6

ただし、このアプリケーションを jar としてパッケージ化すると、次の出力しか得られません。

電卓: 3 3

これはなぜですか、どうすれば修正できますか? 私が見つけた最も近いものはIssue 48でしたが、それは2011年5月の時点で修正されたと言います.確かにそれは今ではMavenになっているでしょう...

0 投票する
1 に答える
235 参照

java - ライブラリを呼び出すクラスのクラスパスを見つける

私は開発中の Java ライブラリでGoogle Reflectionsを使用しています。リフレクションを使用する理由は、特定の注釈を持つすべてのクラスを見つけたいからです。単純化すると、私のライブラリには、これらのクラスに応答するメソッドがあり、次のような行で呼び出されます。

私のライブラリの現在のバージョンでは、リフレクション ライブラリが注釈付きのクラスを探す必要があるパッケージ名を明示的に追加するようユーザーに要求します。

このようにして、リフレクションはそのパッケージにのみ存在するクラスを探します。

ライブラリのユーザーがこの検索パスを追加しない場合は、システム クラス ローダーのすべてのクラスを検索するように Reflections を構成します。明らかに、このソリューションは非常に非効率的です。ただし、ユーザーに常に検索パスを設定するように求めるという要件を本当に取り除きたいと思っています。- 重要な場合の注意点: Reflections では、パッケージ名、url (クラスを見つけることができるクラスパス)、またはクラス ローダーを使用して検索パスを構成できます。

だから私の質問は:私のライブラリを呼び出すクラスのクラスパスを見つける方法はありますか? (私のライブラリコードから)。このようにして、ユーザーが検索場所を明示的に設定していない場合、デフォルトでその場所を追加することを検出できました。これは、システム クラス ローダー全体を代替検索パスとして追加するよりも優れたソリューションと思われます。

ライブラリ コードからメソッド コール スタックを手動で検査できることはわかっていますが、これは少しハックで汚れたソリューションのように思われるため、別のアイデアを探しています。

前もって感謝します。

0 投票する
1 に答える
393 参照

java - Reflectionsライブラリを使用したJavaクラスパスの任意のプロパティを持つクラスのクエリ

私は過去にReflectionsライブラリを使用して、特定のアノテーションを持つ、または特定のクラスから継承するクラスパス内のクラスをクエリしました。ライブラリはそのような特定のクエリに答えるメソッドをすでに提供しているので、これはReflectionsで非常に簡単に行うことができます。

たとえば、次のコードは、パッケージ内にあるクラス(Reflection.javaクラスのドキュメントから取得した例)を探して、から継承するSomeTypeクラスと注釈付きのクラスをクエリする方法を示しています。SomeAnnotationmy.package.prefix

ただし、現在の問題では、任意のプロパティのセット(たとえば、特定のクラス名+既存の注釈+その他の組み合わせ)を持つクラスを照会する必要があります。これらのプロパティは、私が開発しているライブラリを使用してプログラマーが定義する必要があるため、事前にはわかりません。

ソリューションの一部は、クラスが回答セットに含まれるべきかどうかに答えるブールメソッドを使用してStrategyクラスを定義するようにプログラマーに依頼するようなものになると思います。

たとえば、プログラマーは次のようなインターフェイスを実装する必要があります。

したがって、私の質問は、この戦略オブジェクトを取得したら、プログラマーによって定義された戦略クラスに従って一致するクラスのみを保持するクラスをフィルター処理するようにReflectionsライブラリに指示するにはどうすればよいですか?

アップデート:

どうやらフィルタリング部分は最も難しいタスクではありませんが(@MvGの回答に感謝します)、実際にフィルタリングするすべてのクラス(通常はプログラマーによって定義された一連の基本パッケージ内のクラス)を収集します。したがって、アイデアは、すべてのクラスをクエリしてから、次のメソッドでそれらをフィルタリングすることです ReflectionUtils.getAll(allClasses, predicate)

次に、フィルタリングするクラスの初期セットを取得するためにObject、プログラマーが選択した特定のパッケージ内のすべてのサブタイプを照会してみました。

これに使用したコードの下:

これは最良の(より効率的な)ソリューションですか?

誰かが別のアイデアを持っていますか?前もって感謝します !

0 投票する
1 に答える
639 参照

annotations - タイプとメソッドのアノテーションについては、WEB-INF / lib/xxx-ejb.jarをスキャンする必要があります

GoogleReflectionsを使用して次のことを実行したいと思います。

  1. WEB-INF / lib/Patrac-ejb.jarのみをスキャンします

  2. パッケージcom.patracとそのすべてのサブパッケージのみをスキャンします。

  3. タイプアノテーションとメソッドアノテーションのみをスキャンします。

次の構成は正常に機能しているようですが、GoogleReflectionsの使用経験はありません。

動作しているようです。WEB-INF/lib内の他のすべてのJARをスキャンしていないことを確認したいと思います。構成内のフィルター入力と一致しているJARを見つける簡単な方法はありますか?私のアプローチについてのアドバイスをいただければ幸いです。

0 投票する
1 に答える
923 参照

java - 階層内のすべてのタイプがフィルター処理されたクラスパスURLに含まれていない場合に、リフレクションを使用してクラスの(推移的な)サブタイプを検索する

Reflectionsライブラリを使用して、特定のクラスのすべてのサブクラスを取得しようとしています。特定のクラスパスURLのサブクラスのみに検索をフィルタリングする必要があります。これは私が使用しているコードです:

私の問題は次のとおりです。クラスBがAを拡張し、クラスCがBを拡張するとします。

AとBはCとは異なるクラスパスURLにあります。また、リフレクションに指定されたURLはCのURLです。その場合、Cは返されたセットに含まれると予想され、Bは別のセットにあるため存在しないはずです。クラスパスURL。

ただし、返されるセットは空です。Cは、Aの推移的な子孫ですが、リフレクションによって返されるクラスのセットには含まれていません。BをCの同じクラスパスURLに移動すると、BとCの両方が返されます。次に、問題は、階層の中央にあるクラスのいずれかがフィルター処理されたURLにない場合、Reflectionsがデフォルトで(推移的な)サブクラスに応答しないことだと思います。

私の質問は次のとおりです。階層の中央にある特定のクラスがフィルターされたURLにない場合(ただし、サブクラス自体はフィルターされたURLにある場合)、特定のクラスの(推移的な)サブクラスに応答するようにリフレクションに指示するにはどうすればよいですか?

0 投票する
1 に答える
411 参照

java - uberjar としてデプロイされたライブラリを使用するにはどうすればよいですか?

Uber-jar として提供される Reflections 0.9.8 ライブラリを使用しようとしています。その JAR ("reflections-0.9.8-uberjar") をプロジェクトのビルド パスに追加すると、Eclipse はそのクラス タイプ (Reflection、ClasspathHelper など) を見つけられません。

単一の「reflections-0.9.8.jar」(uberのものではない)を抽出してビルドパスに追加すると、コンパイル時にすべて正常に動作しますが、プロジェクトを実行するとNoClassDefFoundErrorが発生します(これは私が依存関係の欠如が原因であることは間違いありません)。

また、uber-jar 内にすべての .jar を追加しようとしましたが、それでも NoClassDefFoundError が発生します。

uberjar として配布されているこのライブラリを使用するには、どうすればよいですか?

編集: それが役立つ場合、これはリフレクションを呼び出したいメソッドです(リフレクションを使用してパッケージ内のすべてのクラスを見つけることができますか?から取得したスニペットです):

0 投票する
1 に答える
482 参照

java - RCP アプリケーション内でリフレクションを使用してアノテーション スキャンを実装する際の問題

これに対する私の最初の試みは、主なアプリケーションの一部として単に Jar を含めることでした。(Eclipse 3.7) これが嫌われていることは承知していますが、私はスタンドアロンの特殊なアプリを作成していて、バンドルを理解しようとすることについてあまり心配していませんでした。

これを実行しようとした:

スタンドアロンのテスト アプリでは問題なく動作しましたが、RCP で試してみると、次の出力が得られました。

だから私は答えを探して、私の問題をカバーしているが、それを解決するのに十分な詳細を私に与えていないこの質問を見つけました。最初のステップとしてリフレクション パッケージをバンドルに移動しましたが、実行するとまったく出力が得られません。リフレクション パッケージからのフィードバック。

my activeActions リストが空であるため、カスタム UrlType を作成するというソリューションの 2 番目の部分を実装していなかったため、スキャンが機能していません (期待していませんでした)。ただし、カスタム URL タイプを実装しましたが、まだ何も見つかりません。リフレクション パッケージからのフィードバックが表示されないため、理由がわかりません。何も見つからないだけです。

誰かが Reflections のログ記録を機能させるのを手伝ってくれて、UrlType ソリューションが機能しない理由を見つけてくれることを願っています。

編集

冗談です。バンドルを気にせず、リフレクション jar をクラスパスに押し込むだけで、カスタム UrlType が登録されていれば、スキャンが機能します。そして、ロギングはすべて機能します。なぜバンドルを気にする必要があるのですか?

0 投票する
1 に答える
3320 参照

java - Reflections.getTypesAnnotatedWith(...)はクラスを検索しますが、getAnnotations()。lengthは0です。

Javaリフレクションライブラリを使用すると、アノテーションで装飾されたクラスを正しく見つけることができます。

しかし、各クラスにいくつの注釈があるかを確認しようとすると、常にゼロが表示されます。

c.getAnnotations()長さ0の配列を返すのはなぜですか?実際、デバッガーでは、のすべてのフィールド(を除くname)はcですnull

0 投票する
1 に答える
1549 参照

java - サブパッケージを無視して特定のパッケージのリソースをクエリするためのReflectionsライブラリの使用

Reflectionsライブラリを使用して、特定のファイル拡張子を持つすべてのリソースを1つのパッケージに正確に配置する方法を教えてください。

私はこのコードで試しました:

ただし、これは、パッケージ「org.p1」およびその中のサブパッケージ(「org.p1.p2」など)に含まれる拡張子「xxx」のすべてのリソースに応答します。

「org.p1」にあるリソースのみに応答し、そのサブパッケージ(存在する場合)を無視するようにReflectionsを構成できますか?