33

Reflectionsライブラリに問題があります。特定のインターフェイスを実装するすべてのクラスを動的にロードしようとしています。これらのクラス(Java 8)でラムダ式を使用しない限り、すべてが正常に機能します(すべてのクラスがロードされます)。lib バージョンをアップグレードしようとしましたが、効果は同じでした (java.io.IOException: 無効な定数タイプ: 18)。

pom.xml の依存関係とビルド

      <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.10</version>
        <exclusions>
            <exclusion>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.19.0-GA</version>
    </dependency>
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
    </build>

除外なしは同じ効果です。

コード:

    URL jarUrl = jarFile.toURI().toURL();
    URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
    ConfigurationBuilder builder = new ConfigurationBuilder()
            .addClassLoader(child)
            .addUrls(jarUrl)
            .setScanners(new SubTypesScanner());
    Reflections r = new Reflections(builder);
    return r.getSubTypesOf(cls);

ラムダ式でクラスをロードするにはどうすればよいですか?

PS英語でごめんなさい:)

4

6 に答える 6

49

この表を見ると、「定数型: 18」はCONSTANT_InvokeDynamic、タグ値が である属性を参照していることがわかります18

つまり、Java 8 と互換性のないクラス パーサーを持つライブラリを使用しています。実際には、この定数値は Java 7 以降で指定されているため、このクラス パーサーは Java 7 と互換性がありません。通常の Java コードは Java 7 でこの機能を使用しないため、これでうまくいきました。 JVM 用のプログラミング言語では、Java 7 で失敗することさえあります。

Reflections のバグトラッカーに、あなたの問題を説明する項目があります。下部に次の通知があります。

この修正により: https://issues.jboss.org/browse/JASSIST-174 javassist はこの定数をサポートしました。したがって、3.18.2-GA ではこのエラーは発生しません。

于 2015-05-19T08:23:01.013 に答える
10

ここで同様の問題を修正しました。私の場合、クラスパスに 2 つの javassist jar がありました。私はmavenを使用しており、それを回避することになっていましたが、依存関係の1つが異なるgroupId(javassist古いものとorg.javassist新しいもの、によってインポートされたものorg.reflections)を使用していたため、mavenはそれらを異なるアーティファクトとして処理しました。

古いライブラリに依存するライブラリを新しいライブラリに依存するように変更しただけで、すべてが修正されました!

于 2016-08-21T18:33:14.680 に答える
0

weblogic を使用している場合、weblogic のクラスローダによってすでにロードされているライブラリと競合する可能性があります。置くことでそれらをオーバーライドできます

...
<weblogic-web-app>
    <container-descriptor>
        <prefer-application-packages>
            <package-name>javassist.*</package-name>
...

Web プロジェクトのweblogic.xml構成ファイルで。実際の Java パッケージは でありjavassistorg.javassist(maven groupId) ではないことに注意してください。

于 2017-07-19T08:48:03.287 に答える