- PR -

DocletにてGenerics型がとれません

1
投稿者投稿内容
winstonfilters
会議室デビュー日: 2007/04/17
投稿数: 2
投稿日時: 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
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-04-18 09:25
Documentを見る限りバグのようですね。
とりあえず
System.out.println(type.qualifiedTypeName() + "<" + type.asParameterizedType() + ">");
としてみては?
↑上のコードは間違ってます。修正しようと思いましたが時間がないのであとで修正します。

[ メッセージ編集済み 編集者: だっちょ 編集日時 2007-04-18 09:36 ]
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 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) {
}
とすればできるようです。
winstonfilters
会議室デビュー日: 2007/04/17
投稿数: 2
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)