FieldAccessorUtils.java
- package com.gh.mygreen.xlsmapper.util;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.stream.Collectors;
- import com.gh.mygreen.xlsmapper.Configuration;
- import com.gh.mygreen.xlsmapper.annotation.XlsArrayColumns;
- import com.gh.mygreen.xlsmapper.annotation.XlsColumn;
- import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
- import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessorFactory;
- import com.gh.mygreen.xlsmapper.xml.AnnotationReader;
- /**
- * {@link FieldAccessor}に対するユーティリティクラス。
- *
- * @since 2.0
- * @author T.TSUCHIE
- *
- */
- public class FieldAccessorUtils {
-
- /**
- * 指定したアノテーションを持つBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
- * @param targetClass 取得元のクラス情報
- * @param annoReader {@link AnnotationReader}のインスタンス。
- * @param annoClass アノテーションのクラス
- * @return プロパティの一覧。存在しない場合は、空のリストを返す。
- * @throws IllegalArgumentException {@literal targetClass == null or annoReader == null or annoClass == null.}
- */
- public static List<FieldAccessor> getPropertiesWithAnnotation(final Class<?> targetClass, final AnnotationReader annoReader,
- final Class<? extends Annotation> annoClass) {
-
- ArgUtils.notNull(targetClass, "targetClass");
- ArgUtils.notNull(annoReader, "annoReader");
- ArgUtils.notNull(annoClass, "annoClass");
-
- final FieldAccessorFactory accessorFactory = new FieldAccessorFactory(annoReader);
- final List<FieldAccessor> list = new ArrayList<>();
-
- for(Method method : targetClass.getMethods()) {
- if(!ClassUtils.isAccessorMethod(method)) {
- continue;
- }
-
- method.setAccessible(true);
-
- final FieldAccessor accessor = accessorFactory.create(method);
- if(accessor.hasAnnotation(annoClass) && !list.contains(accessor)) {
- list.add(accessor);
- }
- }
-
- for(Field field : targetClass.getDeclaredFields()) {
- field.setAccessible(true);
-
- final FieldAccessor accessor = accessorFactory.create(field);
- if(accessor.hasAnnotation(annoClass) && !list.contains(accessor)) {
- list.add(accessor);
- }
-
- }
-
- return list;
-
- }
-
- /**
- * アノテーション{@link XlsColumn}が付与されているBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
- * ただし、属性{@link XlsColumn#columnName()}の値が、指定した値と等しいか判定します。
- *
- * @param targetClass 取得元のクラス情報
- * @param annoReader {@link AnnotationReader}のインスタンス。
- * @param config システム設定情報
- * @param columnName カラムの値
- * @return プロパティの一覧。存在しない場合は、空のリストを返す。
- * @throws IllegalArgumentException {@literal config == null || columnName == null.}
- */
- public static List<FieldAccessor> getColumnPropertiesByName(final Class<?> targetClass, final AnnotationReader annoReader,
- final Configuration config, final String columnName) {
-
- return getPropertiesWithAnnotation(targetClass, annoReader, XlsColumn.class)
- .stream()
- .filter(accessor -> Utils.matches(columnName, accessor.getAnnotation(XlsColumn.class).get().columnName(), config))
- .collect(Collectors.toList());
-
- }
-
- /**
- * アノテーション{@link XlsArrayColumns}が付与されているBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
- * ただし、属性{@link XlsArrayColumns#columnName()}の値が、指定した値と等しいか判定します。
- *
- * @param targetClass 取得元のクラス情報
- * @param annoReader {@link AnnotationReader}のインスタンス。
- * @param config システム設定情報
- * @param columnName カラムの値
- * @return プロパティの一覧。存在しない場合は、空のリストを返す。
- * @throws IllegalArgumentException {@literal config == null || columnName == null.}
- */
- public static List<FieldAccessor> getArrayColumnsPropertiesByName(final Class<?> targetClass, final AnnotationReader annoReader,
- final Configuration config, final String columnName) {
-
- return getPropertiesWithAnnotation(targetClass, annoReader, XlsArrayColumns.class)
- .stream()
- .filter(accessor -> Utils.matches(columnName, accessor.getAnnotation(XlsArrayColumns.class).get().columnName(), config))
- .collect(Collectors.toList());
-
- }
- }