よく落ち着いてみれば、Java リフレクションの Field の getType の返却は、Class<?>
だから、以前書いた 入れ子構造のBean の中の Obejct を取得する(2) - Oboe吹きプログラマの黙示録
も、以下のとおり書き直せる。
import java.lang.reflect.Field; import java.util.function.Function; /** * UniqueFieldfinder */ @FunctionalInterface public interface UniqueFieldfinder<T, R>{ R find(T u); @SuppressWarnings("unchecked") static <T, R> Function<T, R> of(Class<R> c){ return t->(R)search(c, t); } static <T> Object search(Class<T> c, Object o){ Field[] fs = o.getClass().getDeclaredFields(); String cname = c.getName(); for(Field f:fs){ String typename = f.getType().getName(); if (typename.startsWith("[")) continue; try{ f.setAccessible(true); if (f.getType().isPrimitive() || typename.startsWith("java.") || typename.startsWith("jdk.") || typename.startsWith("javax.") || typename.startsWith("org.xml.") || typename.startsWith("org.w3c.")|| typename.startsWith("org.omg.") ){ if (cname.equals(f.getType().getName())){ return f.get(o); } continue; } if (cname.equals(f.getType().getName())){ return f.get(o); } Object v = f.get(o); if (v==null) continue; return search(c, v); }catch(IllegalArgumentException e){ }catch(IllegalAccessException e){ } } return null; } }
でも、相変わらず、探索に指定する型が重複して持っている場合はうまく取得できない。
List や、Map、Collection は指定して取得できない。
配列も指定して取得できない。
という制約でこれはあまり使いものにならない。