2009-03-05 11 views
0

Eclipseプラグインを作成していますが、ITypeではなく、選択したファイルのClassオブジェクトが必要です。それは可能なのでしょうか、どのようにするのが最善の方法ですか?Eclipseプラグイン - クラスオブジェクト

編集:考えてみると、(junit、プロファイラ、その他のプラグインのように)実行するように追加するのが最も良い方法です。私は彼らがその関数を実行しているので、クラスにアクセスする必要があると思います(Xが問題のクラスの場合)。どのようにしてアクションとして実行され、ライブオブジェクトを取得するプラグインを作成するのですか?

+0

あなたは何を意味するか分かりますか?現在のソースファイルで表されるクラスを使用しますか?そのクラスの表現ですか? – Uri

+0

私のプラグインは、現在のソースファイル – Sarmun

答えて

2

eclipseプラグインでは、たとえば、選択したファイルをIActionで取得します。
は(それは、アクションは、典型的には、ツールバーのボタン、メニュー項目、およびアイテムに関連付けられたエンドユーザによってトリガすることができるコマンドの非UI側を表す。)そこから

IResource selectedResource = ResourceUtils.getSelectedResource(); 

IResourceファイルシステムのファイルとディレクトリの類似した作業領域。ファイル、フォルダ、プロジェクト、およびワークスペースルートの4つのタイプがのリソースです。その型から

、あなたはその完全なパスにアクセスも与える、IFileにそれをキャストすることができます(getFullPath()

0

はITYPE「curIType」のクラス名は

curIType.getFullyQualifiedName() 
を介して検索することができます

これは簡単な部分です。しかし、あなたは問題を抱えています。このクラスはプラグインのクラスローダーになくてもかまいません(もしそれがuserprojectのクラスであれば、クラスローダーの一部ではありません)。したがってClass.forName(classname)を呼び出すことは何の役にも立たないでしょう。

私は同様のケースがあり、現在のクラスローダーのすべてのライブラリとそのタイプのプロジェクトのすべてのライブラリを含む独自のクラスローダーで独自のスレッドを作成して解決しました(最初の試みで)。それは短いコードでも単純なものでもなく、私はすでにそれをリファクタリングしました。 ITypeからすべての情報を取得し、プラグインコード内のどこのクラスも使用しない方がはるかに簡単です。

2

Eclipseはファイル(IResource)であるか、Javaタイプ(IJavaType)であるかの抽象表現を使用します。ソースファイルをコンパイルする必要がないため(たとえば、自動ビルドを無効にする)、編集中のコードの.classファイルまたはClassオブジェクトは必ずしも必要ではありません。したがって、ユーザーインターフェイスの選択項目から「クラス」オブジェクトを取得する正しい方法はありません。

しかし、昨日のように、Eclipseビルダーのメカニズムは常にソースファイルをすぐにコンパイルし、.classファイルが存在することに頼ることができます。この.classファイルに到達するには、プロジェクトの動的クラスローダーを作成するか、ランタイムVMを起動する必要があります。私はそれを試して、それは動作しますが、それは非常に不安定なアプローチであり、さまざまな障害を追跡することが困難です。

+0

のクラスで呼び出すべきdoSomething(クラス clazz)関数を持っています。例えば、JUNITはどんな優雅なやり方ではなく、複雑なアプローチですか? (彼らは確かにソースをコンパイルしてロードする必要があります) – Sarmun

+0

JUnitは新しいVMを起動しており、そのVMはそのクラスパス上にコンパイルされたクラスを持っています。私は、JUnitMaxが動的なクラスのロードを使用するか、プールを使用するかどうかに関係なく、リアルタイムテストをどのように行っているのかよく分かりません。 – mhaller