あるネーミングルールのクラス/メソッドを探す
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()
いろいろ残念コードなので、また今度書き換えよ。。。