StaticMethodMapCreator.java

package com.github.mygreen.messageformatter.expression;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

import org.springframework.util.ReflectionUtils;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * EL式中で使用するためのstaticメソッドのマッピング情報を作成します。
 *
 * @author T.TSUCHIE
 *
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StaticMethodMapCreator {

    /**
     * ユーティリティクラスからメソッド情報を抽出する。
     * EL式中の独自関数として使用する。
     * @param targetClass 抽出対象のクラス。
     * @return メソッド名とメソッド情報のマップ。
     */
    public static Map<String, Method> create(final Class<?> targetClass) {
        return create(targetClass, null);
    }

    /**
     * ユーティリティクラスからメソッド情報を抽出する。
     * EL式中の独自関数として使用する。
     * @param targetClass 抽出対象のクラス。
     * @param prefix メソッドの接頭語(指定しない場合はnull)
     * @return メソッド名とメソッド情報のマップ。
     */
    public static Map<String, Method> create(final Class<?> targetClass, final String prefix) {

        Map<String, Method> map = new HashMap<>();

        final String p = prefix == null ? "" : prefix;

        ReflectionUtils.doWithMethods(targetClass,
                method -> {
                    ReflectionUtils.makeAccessible(method);
                    map.put(p + method.getName(), method);
                },
                method -> Modifier.isPublic(method.getModifiers()) && Modifier.isStatic(method.getModifiers()));

        return map;

    }
}