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();
}
ようするにソース上の文字列上の場所を探してきて、
IJavaElement[] elements = unit.codeSelect(start, length);
としてIJavaElementを生成してるわけですね。。これだと、びみょーに他のクラスを取得してしまう可能性があるような。。別パッケージの同じ名前のクラスとかですね。。あーそのための戻り値が配列なんですかね。。*1
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なクラスの他にもクラスを定義している場合などですね。インナークラスは出てこないようです。
この記事は
現在のアクセス:10553