package net.ion.rosetta.misc; import java.util.HashMap; import java.util.Map; /** * Common utility for working with reflection. * * @author Ben Yu */ final class Reflection { /** Gets the class name of {@code obj} or "null" if {@code obj} is null. */ static String getClassName(Object obj) { return (obj == null) ? "null" : obj.getClass().getName(); } @SuppressWarnings("unchecked") private static final Map<Class, Class> WRAPPERS = new HashMap<Class, Class>(); private static <T> void primitive(Class<T> primitive, Class<T> wrapper) { WRAPPERS.put(primitive, wrapper); } static { primitive(byte.class, Byte.class); primitive(short.class, Short.class); primitive(int.class, Integer.class); primitive(long.class, Long.class); primitive(boolean.class, Boolean.class); primitive(float.class, Float.class); primitive(double.class, Double.class); primitive(char.class, Character.class); primitive(void.class, Void.class); } static <T> Class<T> wrapperClass(Class<T> type) { @SuppressWarnings("unchecked") Class<T> wrapperClass = WRAPPERS.get(type); return (wrapperClass == null) ? type : wrapperClass; } static boolean isInstance(Class<?> type, Object obj) { return wrapperClass(type).isInstance(obj); } static boolean isAssignable(Class<?> type, Object obj) { return obj == null ? !type.isPrimitive() : isInstance(type, obj); } }