VisitorのうちTypeDeclaration? を引数に取る
public boolean visit(TypeDeclaration node);
はクラスのいろいろな情報がとれそうです。
TypeDeclaration? はあるソースコード内の一つのクラスに対応しています。TypeDeclaration? からそのクラスのクラス名は?とか親インタフェースは?とか、いろいろ取得できるわけですね。
package nu.mine.kino; public interface IBL { void exe(); String exe(String hoge); }
package nu.mine.kino; import java.io.Serializable; public class BL implements IBL, Serializable { private final String field; public BL() { System.out.println("Constructor"); field = ""; } public BL(String field) { System.out.println("Constructor"); this.field = field; } public void exe() { System.out.println("hoge"); } public String exe(String hoge) { System.out.println(hoge); return hoge; } }
上のBLに対して
List interfaces = node.superInterfaceTypes();
を実行するとorg.eclipse.jdt.core.dom.SimpleType?のListが取得できます。このSimpleType?に対して、
SimpleType#getName();
とすることで実装しているインタフェース名が取得できます。
苦労しました。以下のような感じ??elementは ICompilationUnit? です。
List superInterfaceTypes = node.superInterfaceTypes(); logger.debug("SuperInterfaceTypes: " + superInterfaceTypes); try { // ソースコードの文字列を取得 String source = element.getSource(); // 取得したインタフェース名でループ for (Object interfaze : superInterfaceTypes) { Type typee = (Type) interfaze; // System.out.println(typee.toString()); int start = source.indexOf(typee.toString()); int length = typee.toString().length(); // 上のstart,lengthで挟まれる部分から、IJavaElementを生成 IJavaElement[] elements = element.codeSelect(start, length); for (IJavaElement element : elements) { logger.debug("Path: " + element.getPath().toOSString()); logger.debug("Element Name: " + element.getElementName()); // elementがITypeだったら、 if (element.getElementType() == IJavaElement.TYPE) { logger.debug(element.getElementName() + "はITYPEです"); IType type = (IType) element; logger.debug("パッケージ名: " + type.getPackageFragment() .getElementName()); } } } } catch (JavaModelException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); }
elementは ICompilationUnit? です。
try { IType[] types = element.getTypes(); for (IType type : types) { logger.debug("Types[i]: " + type.getElementName()); } } catch (JavaModelException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); }
これでそのソースコードに書かれているクラスのクラス名をすべて取得することができます。たとえばpublicなクラスの他にもクラスを定義している場合などですね。インナークラスは出てこないようです。
この記事は
現在のアクセス:10000