17

次のコードを使用して拡張するクラスの別の jar を検索するために、 Reflectionsと呼ばれるサード パーティのライブラリを使用しています (Javaリフレクションと間違わないでください)。Foo

Reflections reflections = new Reflections("com.example");
for(Class<? extends Foo> e : reflections.getSubTypesOf(Foo.class)) {
    doSomething()
}

これを行うと、Reflections は次のエラーをスローします。

org.reflections.ReflectionsException: could not get type for name com.example.ExtendsFoo

私が困惑している原因を修正する方法を知っている人はいますか?

前もって感謝します!

4

3 に答える 3

14

この問題は、名前を解決できるクラス・ローダーがないことが原因である可能性があります (サブタイプは解決できますが)。これは矛盾しているように聞こえますが、構成を構築ClasspathHelper.forClassLoaderし、アプリケーションでインスタンス化された URLClassloader を使用してクラスパスで何をスキャンするかを判断しているときにエラー メッセージが表示されましたが、その URLClassLoader を Reflections 構成に渡してインスタンス化できるようにしていませんでした。正しく。

したがって、次の行に沿って何かを試してみてください。

URLClassLoader urlcl = new URLClassLoader(urls);
Reflections reflections = new Reflections(
  new ConfigurationBuilder().setUrls(
    ClasspathHelper.forClassLoader(urlcl)
  ).addClassLoader(urlcl)
);

ここurlsで、ロードするクラスを含む jar への URL の配列です。addClassLoader(...)への最後の呼び出しがなかった場合、あなたと同じエラーが発生していましたConfigurationBuilder

これが機能しない場合、または適用できない場合は、ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders))何が起こっているかを確認するためにブレークポイントを設定するだけの価値があるかもしれません。

于 2013-08-25T01:24:06.967 に答える