S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

あるネーミングルールのクラス/メソッドを探す

SAStrutsの落とし穴にあるように、Actionクラスのgetterを探したいとのこと。
以前クラスパス上のクラスをリスト化するClassViewerを作ってたので、こいつ使います。
下記ではmainメソッドで、*Finderクラスのget*メソッドを探す。

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class MethodFinder {

    ClassViewer viewer = new ClassViewer();

    public MethodFinder() {
        this.viewer.setup();
    }

    public static void main(String [] args) {
        MethodFinder finder = new MethodFinder();
        try {
            // List<Method> methodList = finder.find(null, ".*Action$", "^get.*");
            List<Method> methodList = finder.find(null, ".*Finder$", "^get.*");
            for (Method m : methodList) {
                System.out.println(m.getDeclaringClass() + "\t" + m);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // メソッドを探す
    public List<Method> find(String findPackage, String findClass, String findMethod) throws ClassNotFoundException {

        List<Method> methodList = new ArrayList<>();

        for (String clsname : this.viewer.getAllClassList()) {

            try {

                Class<?> cls = Class.forName(clsname);

                // パッケージ名のチェック
                if (findPackage != null) {
                    if (!cls.getPackage().getName().matches(findPackage)) {
                        continue;
                    }
                }

                // クラス名のチェック
                if (findClass != null) {
                    if (!cls.getSimpleName().matches(findClass)) {
                        continue;
                    }
                }

                // メソッド名のチェック
                if (findMethod != null) {
                    for (Method method : cls.getDeclaredMethods()) {
                        if (!method.getName().matches(findMethod)) {
                            continue;
                        }
                        methodList.add(method);
                    }
                }

            } catch (Error | Exception e) {
                // クラスオブジェクトが取得できない場合はスキップ
                continue;
            }

        }

        return methodList;

    }

    public void getPublic() { }
    protected void getProtected() { }
    private void getPrivate() { }

}

結果はこんな感じ。

class xxx.MethodFinder	public void xxx.MethodFinder.getPublic()
class xxx.MethodFinder	protected void xxx.MethodFinder.getProtected()
class xxx.MethodFinder	private void xxx.MethodFinder.getPrivate()


いろいろ残念コードなので、また今度書き換えよ。。。