4

クラス A と、Eclipse ワークスペースで A を継承するクラス B があります。

ここに画像の説明を入力 ここに画像の説明を入力

私が抱えている問題は、Eclipse JDT API を使用してタイプ B のスーパータイプを取得しようとしたときに何も得られなかったことです。これはコードです(私はコードを取得しました -完全修飾名を持つすべてのサブクラスをリストします):

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
java.io.File workspaceDirectory = root.getLocation().toFile();

// 1. The name of the project in the workspace
IProgressMonitor pm = new NullProgressMonitor();    
IProject orig = root.getProject(this.projectName);
orig.open(pm);
this.javaProject = JavaCore.create(orig);
orig.refreshLocal(IResource.DEPTH_INFINITE, pm);

// 2. Find the type                
IType type = this.javaProject.findType("p.B"); <-- returns correct type info
ITypeHierarchy hier = type.newSupertypeHierarchy(new NullProgressMonitor());
IType[] types = hier.getAllSuperclasses(type);
System.out.println(types); <-- Returns []

パッケージ内のリソースを更新/更新するコードも追加しました。

IPackageFragmentRoot[] packageFragmentRoots = this.javaProject.getPackageFragmentRoots();
for (IPackageFragmentRoot proot: packageFragmentRoots)
{
    proot.getResource().refreshLocal(IResource.DEPTH_INFINITE, null);
}

階層型情報を取得することを除いて、すべて正常に機能します。何が間違っている可能性がありますか? API を実行する前に設定を忘れていませんか?

私のはヘッドレス RCP アプリケーションです。

4

1 に答える 1

1

これは一時的な解決策かもしれませんが、私にとってはうまくいきました。

短い答え

libディレクトリを作成し、このrtstubs.jarをディレクトリにコピーします。jarファイルがプロジェクトに含まれていることを確認するには、Eclipse IDEを更新(F5)する必要がある場合があります。

ここに画像の説明を入力してください

次に、「Javaビルドパス」で、このjarファイルを追加する必要があります。

ここに画像の説明を入力してください

パッケージフラグメントにjarファイルを含めると、クラス階層が取得されます。

ここに画像の説明を入力してください

ロングアンサー(なぜこれで問題が解決するのか)

ReplicationUnitDeclaration(org.eclipse.jdt.internal.compiler.ast)およびHierarchy Resolver(org.eclipse.jdt.internal.core.hierarchy)

フィールドignoreFurtherInvestigationがあり、メソッドhasErrors()はこのフィールドを返します。

org.eclipse.jdt.internal.core.hierarchy.HierarchyResolver#resolve()メソッドは、hasError()を呼び出して、タイプ情報をキャッシュに追加します。ただし、jarファイルを含めないと、クラスの階層情報が格納されないように、hasError()メソッドは常にfalseを返します。

ここに画像の説明を入力してください

org.eclipse.jdt.internal.core.JavaProjectElementInfo

このクラスには、やなどのキャッシュ初期化メソッドがinitializePackageNamesありgetProjectCacheます。メソッドではgetProjectCache()、パッケージフラグメント要素のルートがロードされ、キャッシュに追加されます。

ここに画像の説明を入力してください

パッケージフラグメントにrtstubs.jarを含めると、キャッシュにすべてのJavaクラス階層が含まれるようになります。この設定がないと、キャッシュの構築中に、ignoreFurtherInvestigationフィールドがオンになり、hasError()メソッドはtrueを返し、クラス階層情報を含まず、何も返しません。

ここに画像の説明を入力してください

追加した

他の解決策は、IRegionを使用することです。

JDT TypeHierarchyでregion(= java Elementsのセット)パラメーターを設定するにはどうすればよいですか?

于 2013-01-15T01:30:20.003 に答える