- - PR -
DocletにてGenerics型がとれません
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-04-17 16:02
Docletを使って作成済みのJavaコードからメソッド一覧を作りたく、
以下のような処理を行っています。 import com.sun.javadoc.*; public class MyDoclet extends Doclet { public static boolean start(RootDoc root) { MyDoclet doclet = new MyDoclet(); doclet.list(root); return true; } public void list(RootDoc root) throws Exception { ClassDoc[] classes = root.classes(); for (int i = 0; i < classes.length; ++i) { if (classes[i].isInterface()) { MethodDoc[] methods = classes[i].methods(); for (int j = 0; j < methods.length; j++) { Type type = methods[j].returnType(); System.out.println(type.toString()); } } } } } この処理はメソッドの戻り値を取得しています。 DocletのAPI仕様を見ると、Type.toString()について、 「型の文字列表現を返します。返される文字列表現には、次元情報や型の引数が含まれます。たとえば、String の 2 次元配列は「java.lang.String[][]」を返し、パラメータ化した型の List<Integer> は「java.util.List<java.lang.Integer>」を返します。 」 とあるのですが、 実際、List<Integer>で定義したメソッドの戻り値を上記の処理で調べると、 「java.util.List」だけが帰ってきてしまいます。 これはdocletのバグでしょうか? 何かご存知の方がいらっしゃいましたら、助言いただけると幸いです。 参照 Doclet API仕様 https://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/spec/index.html?com/sun/javadoc/package-summary.html |
|
投稿日時: 2007-04-18 09:25
Documentを見る限りバグのようですね。
とりあえず System.out.println(type.qualifiedTypeName() + "<" + type.asParameterizedType() + ">"); としてみては? ↑上のコードは間違ってます。修正しようと思いましたが時間がないのであとで修正します。 [ メッセージ編集済み 編集者: だっちょ 編集日時 2007-04-18 09:36 ] |
|
投稿日時: 2007-04-18 13:03
ParameterizedType ptype = type.asParameterizedType();
if (ptype!=null) { System.out.print(type.qualifiedTypeName() + "<"); Type[] args = ptype.typeArguments(); for (int k=0;k<args.length;k++) { System.out.print("," + args[k]); } System.out.println(">"); } に修正しようと思って試してみたら、根本的にreturnType関数がだめみたいですね。 genericReturnType関数の追加が必要なのでしょう。 どうしてもやるのなら、docletpathに対象ソースのクラスを追加して、 MethodDocの代わりにMethodを使用して try { Class cls = Class.forName(classes[i].qualifiedName()); java.lang.reflect.Method[] ms = cls.getMethods(); for (int j=0;j<ms.length;j++) { java.lang.reflect.Type type = ms[j].getGenericReturnType(); System.out.println(type.toString()); } } catch (Exception e) { } とすればできるようです。 |
|
投稿日時: 2007-04-18 15:21
調べたところDocletのlanguageVersionメソッドをオーバーライドして、
「ドックレットが 5.0 ソースをサポートしていることを示す」必要があるようです。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/transition-1.5docletapi.html 自己解決です。お騒がせしました。 だっちょさん、ありがとうございます。 |
1