ClassUtils.java

package com.github.mygreen.sqlmapper.core.util;

import java.lang.reflect.Method;

import org.springframework.util.Assert;

/**
 * クラスやメソッドに関するユーティリティクラス。
 * また、リフレクションについても処理する。
 *
 *
 * @author T.TSUCHIE
 *
 */
public class ClassUtils {

    /**
     * メソッドがアクセッサメソッド(getter/setter)か判定します。
     *
     * @param method メソッド情報
     * @return trueの場合、アクセッサメソッド。
     */
    public static boolean isAccessorMethod(final Method method) {

        return isGetterMethod(method)
                || isBooleanGetterMethod(method)
                || isSetterMethod(method);

    }

    /**
     * メソッドがgetterの書式かどうか判定する。
     * ただし、boolean型にたいするisは{@link #isBooleanGetterMethod(Method)}で判定すること。
     * <ol>
     *  <li>メソッド名が'get'か始まっていること。</li>
     *  <li>メソッド名が4文字以上であること。</li>
     *  <li>引数がないこと。</li>
     *  <li>戻り値が存在すること。</li>
     * </ol>
     * @param method メソッド情報
     * @return trueの場合はgetterメソッドである。
     */
    public static boolean isGetterMethod(final Method method) {

        final String methodName = method.getName();
        if(!methodName.startsWith("get")) {
            return false;

        } else if(methodName.length() <= 3) {
            return false;
        }

        if(method.getParameterCount() > 0) {
            return false;
        }

        if(method.getReturnType().equals(Void.class)) {
            return false;
        }

        return true;

    }

    /**
     * メソッドがsetterの書式かどうか判定する。
     * <ol>
     *  <li>メソッド名が'set'か始まっていること。</li>
     *  <li>メソッド名が4文字以上であること。</li>
     *  <li>引数が1つのみ存在すること</li>
     *  <li>戻り値は、検証しません。</li>
     * </ol>
     * @param method メソッド情報
     * @return trueの場合はsetterメソッドである。
     */
    public static boolean isSetterMethod(final Method method) {

        final String methodName = method.getName();
        if(!methodName.startsWith("set")) {
            return false;

        } else if(methodName.length() <= 3) {
            return false;
        }

        if(method.getParameterCount() != 1) {
            return false;
        }

        return true;

    }

    /**
     * メソッドがプリミティブ型のbooleanに対するgetterの書式かどうか判定する。
     * <ol>
     *  <li>メソッド名が'is'か始まっていること。</li>
     *  <li>メソッド名が3文字以上であること。</li>
     *  <li>引数がないこと。</li>
     *  <li>戻り値がプリミティブのboolean型であること。</li>
     * </ol>
     *
     * @param method メソッド情報
     * @return trueの場合はboolean型のgetterメソッドである。
     */
    public static boolean isBooleanGetterMethod(final Method method) {

        final String methodName = method.getName();
        if(!methodName.startsWith("is")) {
            return false;

        } else if(methodName.length() <= 2) {
            return false;
        }

        if(method.getParameterCount() > 0) {
            return false;
        }

        if(!isPrimitiveBoolean(method.getReturnType())) {
            return false;
        }

        return true;
    }

    /**
     * タイプがプリミティブのboolean型かどうか判定する。
     * @param type 判定対象のクラスタイプ。
     * @return trueの場合、プリミティブのboolean型。
     * @throws IllegalArgumentException {@literal type == null.}
     */
    public static boolean isPrimitiveBoolean(final Class<?> type) {
        Assert.notNull(type, "type");

        if(type.isPrimitive() && boolean.class.isAssignableFrom(type)) {
            return true;
        }

        return false;
    }

}