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.
1 に答える
私はついに解決策を見つけました。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]
. これには、私が使用したすべてのクラスとインターフェイス、およびジェネリックのパラメーター化に使用されるすべての型が含まれています。