谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

Axis2ってクラス解析を自前でやってるんだ。

Axis2ってWSDLの生成を行なってるんだけど
WSDLに、サービスメソッドの引数名って入ってるよね?


これ、どうやって取ってるのかなーと思って調査開始。


まず、S2Containerの場合。
S2Containerでは、メソッドの引数名の取得って

という順番で行なわれるらしいんだけど、
試しにBeanDesc#getMethodParameterNamesってやってみたら、
なんか取得できなかった。


取得できない理由は、BeanDescImplの400行目

final ParameterAnnotationsAttribute attribute = (ParameterAnnotationsAttribute) methodInfo
    .getAttribute(ParameterAnnotationsAttribute.visibleTag);

ここでnullが戻ってきて、それ以上は処理されないから。
原因を追究するのは後回しにして、とにかく、処理されない。


では、Axis2の場合。
org.apache.ws.java2wsdl.bytecode.ClassReaderの中で、
ごりごりクラスファイル読んでますね。


これを使いたい場合は、上位クラスであるParamReaderをnewして使う。

ParamReader reader = new ParamReader(obj.getClass());
String[] paramNames = reader.getParameterNames(method);

これだけで、引数名の一覧が取れました。


もちろん、デバッグ情報が必要とか、
interfaceだけやabstractのメソッドの引数名は取得できないとか
そんな制限は他と変わらず。


勉強になりました。