Eclipseプラグイン・プロジェクトでJavaのクラスのメソッド・パラメータの名前をリフレクションで取得できない時の暫定対応メモ
Java8以降、クラスのコンストラクタを含むメソッドのパラメータ名をリフレクションを通して取得できるようになりました。javac
に-parameters
オプションを追加してコンパイルすることで、これに必要な情報がクラスファイルに格納されます。
Eclipseにおいては、例えばJavaプロジェクトの場合、プロジェクト共通あるいはプロジェクト毎の設定において、以下のチェックを入れてエクスポートすることで、対応したjarを作成することができます。恐らく、チェックすることで、-parameters
オプションが内部で設定されてコンパイルされるのだろうと思います。
簡略ですが、以下のような感じでコンストラクタやメソッドオブジェクトへの参照からリフレクションを使って、パラメータ名を確認することができます。
for (Constructor<?> constructor : clazz.getDeclaredConstructors()) {
System.out.println("constructor: " + constructor.getName());
for (Parameter param : constructor.getParameters()) {
System.out.println(" param: " + param.getName() + ", type: " + param.getType().getSimpleName());
}
}
for (Method method : clazz.getDeclaredMethods()) {
System.out.println("method: " + method.getName());
for (Parameter param : method.getParameters()) {
System.out.println(" param: " + param.getName() + ", type: " + param.getType().getSimpleName());
}
}
問題の症状
ところが、プラグイン・プロジェクトの場合、何故か、この設定が機能していないようで、エクスポートして作成したjar
(というかバンドル)では、メソッドのパラメータ名は、arg0, arg1, arg2…
となります。このような名前は、-parameters
オプションを指定しない場合に、自動的に付けられるものです。なお、使用しているEclipse IDEは、Version: 2020-06 (4.16.0) Build id: 20200615-1200
です。(多分、最新)
このことから、プラグイン・プロジェクトの場合、チェックを入れても、実際には-paramters
オプションが使用されずにコンパイルされているように見えます。なお、チェックを入れると、以下のファイルに次の一行が追加されます。
<プロジェクト>/.settings/org.eclipse.jdt.core.prefs
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
この設定が入ったプロジェクトでエクスポートすることで、メソッドのパラメータ名をリフレクションで取得可能なjar
が作成されることが期待されます。
プラグイン・プロジェクトの場合、バンドルの依存関係を明示したMANIFEST.MF
を作成して、手軽にOSGiバンドルを作成できて重宝なのですが、今回の件は、かなり不便に感じました。
暫定対応
そこで、一旦、プラグイン・プロジェクトで作成した、バンドルの依存関係を解決したMANIFEST.MF
の雛形を、別途、そのプラグイン・プロジェクトと同一ソースのJavaプロジェクトを起こして、そこから参照させてOSGiバンドルを作成することにしました。(安易ですが)
以上、備忘録でした。(何か誤解しているかも?)
Author And Source
この問題について(Eclipseプラグイン・プロジェクトでJavaのクラスのメソッド・パラメータの名前をリフレクションで取得できない時の暫定対応メモ), 我々は、より多くの情報をここで見つけました https://qiita.com/s5uishida/items/478058335a8020e1977b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .