6

I'm trying to get all dependencies in a Java class, including classes used for generics parametrization and local variables types. So far best framework I've found is apache bcel. Using it I can easily find all fields, method arguments and local variables from byte code. Basically everything except of generics and local variables types. For example, from line List<Point> points = new ArrayList<Point>(); I can only find one dependency - ArrayList using JavaClass.getConstantPool() method from bcel. It can't detect neither List interface nor Point class. I also tried tattletale and CDA, unfortunately without success (the same results). Examining imports is not enough - I need also dependencies from the same package and I can't accept wildcards. I would be grateful for any help.

4

1 に答える 1

8

私はついに解決策を見つけました。ASM Bytecode Framework使用するのに適したツールです。公式のチュートリアルと適切な例を使用すると、必要なすべての依存関係を簡単に取得できます。この例では、私が望むことを行うビジター クラスが既に存在DependencyVisitorします。適切な書式を設定するために、DependencyVistitorサンプル コードのメソッドを 1 つだけ変更する必要があったため、パッケージのみではなく、完全なクラス名を追加しました。

private String getGroupKey(String name)
{
        //Just comment that block so you can get full class names instead of package only
        /*
        int n = name.lastIndexOf('/');
        if (n > -1)
        {
            name = name.substring(0, n);
        }
       */
        // Replace resource char with package separator char        
        packages.add(name.replace("/", "."));
        //packages.add(name);
        return name;
}

コードを見ると、DependencyVisitorその機能を簡単に理解し、必要に応じて変更できます。私のサンプルクラスで実行すると、素敵で便利な出力が得られます: [java.util.ArrayList, java.lang.Object, java.util.List, java.awt.Point, goobar.test.asmhello.TestClass, java.lang.String, java.lang.Integer, java.awt.Graphics, goobar.test.asmhello.TestClass2]. これには、私が使用したすべてのクラスとインターフェイス、およびジェネリックのパラメーター化に使用されるすべての型が含まれています。

于 2013-06-29T12:04:26.977 に答える