-Aptでメソッドのパラメータ名を取る。

昨日のSeasarConで、S2Daoリーダの上原さんがうろうろしていたのでファウンデーションブースに手招きして入会させた後、事務を手伝ってもらう(ように威圧)。座ってる中、Aptでメソッドのパラメータ名を取れるかどうか聞かれたので調査コード書いてみました。

public class ParamNameProcessorFactory
implements AnnotationProcessorFactory {
  public Collection<String> supportedAnnotationTypes() {
    return Collections.unmodifiableList(Arrays.asList("*"));
  }
  public Collection<String> supportedOptions() {
    return Collections.emptySet();
  }
  public AnnotationProcessor getProcessorFor(
      Set<AnnotationTypeDeclaration> atds,
      AnnotationProcessorEnvironment env) {
    Messager messager = env.getMessager();
    for (TypeDeclaration td : env.getTypeDeclarations()) {
      messager.printNotice(td.getQualifiedName());
      for(MethodDeclaration md: td.getMethods()) {
        messager.printNotice(md.getSimpleName());
        for(ParameterDeclaration pd: md.getParameters()) {
          messager.printNotice(pd.getSimpleName() + ": " +
              pd.getType().toString());
        }
      }
    }
    return AnnotationProcessors.NO_OP;
  }
}

とまあ、スマン、ProcessorFactoryダケで適当に済ましましたが。。。

public interface SampleDao {
  String getUserName(String uid);
}

こういう対象クラスをAptで処理すると、

(。。。省略)
sample.apt:
[java] 注: org.ashikunep.javapress47.sample.SampleDao
[java] 注: getUserName
[java] 注: uid: java.lang.String
BUILD SUCCESSFUL
Total time: 6 seconds

ハイ、「uid」出力されてますね。ということでAptではパラメータ名がちゃんと取れる、ということでした。