9

jar 内のクラスが特定のインターフェイスを実装しているかどうかを確認したい。以下のコードを実装しましたが、jar ファイル内のすべてのクラスを反復処理し、各クラスでこの特定のインターフェイスを実装しているかどうかを確認します。

    public static synchronized boolean findClassesInJar(final Class<?> baseInterface, final String jarName){
        final List<String> classesTobeReturned = new ArrayList<String>();
        if (!StringUtils.isBlank(jarName)) {
            //jarName is relative location of jar wrt. 
            final String jarFullPath = File.separator + jarName;
            final ClassLoader classLoader = this.getClassLoader();
            JarInputStream jarFile = null;
            URLClassLoader ucl = null;
            final URL url = new URL("jar:file:" + jarFullPath + "!/");
            ucl = new URLClassLoader(new URL[] { url }, classLoader);
            jarFile = new JarInputStream(new FileInputStream(jarFullPath));
            JarEntry jarEntry;
            while (true) {
                jarEntry = jarFile.getNextJarEntry();
                if (jarEntry == null)
                    break;
                if (jarEntry.getName().endsWith(".class")) {
                    String classname = jarEntry.getName().replaceAll("/", "\\.");
                    classname = classname.substring(0, classname.length() - 6);
                    if (!classname.contains("$")) {
                        try {
                            final Class<?> myLoadedClass = Class.forName(classname, true, ucl);
                            if (baseInterface.isAssignableFrom(myLoadedClass)) {
                                return true;
                            }
                        } catch (final ClassNotFoundException e) {

                        } 
                    }
                }
            }
        return false;
    }

これを行う簡単な方法はありますか?100 個のクラス ファイルを含む jar があり、100 番目のクラスがこのインターフェイスを実装している場合、上記のコードを使用して、100 個のクラス ファイルすべてを反復処理し、インターフェイスが実装されているかどうかを確認する必要があります。それを行う効率的な方法はありますか?

4

5 に答える 5

3

Spring にはこのためのヘルパー コードがいくつかありClassPathScanningCandidateComponentProviderますが、基本的にはユーザーが行ったことを実行します。

特定のパッケージ内のすべてのクラスまたは特定のインターフェースを実装するすべてのクラスも実装しequals()hashCode()

Freud の優れた点は、Javaソースとクラスファイル (つまり、ソース コードとコンパイルされたバイト コード) を分析できること、プロパティまたはテキスト ファイルを調べることができること、CSS と Spring 構成を読み取ることができることです (したがって、すべての重要なDAO Bean のメソッドには@Transactional) があります。

于 2013-05-14T17:41:12.757 に答える
0

最新の IDE (Eclipse、IntelliJ など) は、特定のインターフェイス (またはクラスまたはメソッド) の使用法を見つけることができるはずです。

jar ファイルのソースがある場合は、それを依存関係としてプロジェクトに追加できます。または、jar の内容を単純に解凍し、それをプロジェクトとして IDE で開き、関心のあるインターフェイスの使用法を見つけることができます。

于 2013-05-14T14:59:19.010 に答える
0

これには IntelliJ を使用できます。ダミー プロジェクトを作成し、jar をクラスパスに追加します。次に、インターフェイスを開き、インターフェイス名の左側にある (I) アイコンをクリックします。Eclilseについてはわかりませんが、同じことができると確信しています。

クラスについても同様です。

ここに画像の説明を入力

于 2016-01-03T23:02:59.640 に答える