
com.sdklite.util.Introspector Maven / Gradle / Ivy
package com.sdklite.util;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Represents an introspector for Java Beans
*
* @author johnsonlee
*
*/
public abstract class Introspector {
/**
* Returns the properties of the specified bean
*
* @param bean
* The object to introspect
* @return the properties or it self if the specified bean is a map
*/
public static Map properties(final Object bean) {
return properties(bean, false);
}
/**
* Returns the properties of the specified bean
*
* @param bean
* The object to introspect
* @param includeSuperClass
* The value indicates whether include properties of super class
* or not
* @return the properties or it self if the specified bean is a map
*/
public static Map properties(final Object bean, boolean includeSuperClass) {
return Collections.unmodifiableMap(object2map(bean, includeSuperClass));
}
/**
* Returns the value of the specified property of the specified bean
*
* @param bean
* The object to introspect
* @param name
* The property name
* @return the value of the property
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static T getProperty(final Object bean, final String name) throws Exception {
final Method getter = getter(bean.getClass(), name);
if (null == getter) {
throw new NoSuchMethodException("Getter of " + name);
}
getter.setAccessible(true);
return (T) getter.invoke(bean);
}
/**
* Sets the value o fthe specified property of the specified bean
*
* @param bean
* The object to introspect
* @param name
* The property name
* @param value
* The value of property
* @throws Exception
*/
public static void setProperty(final Object bean, final String name, final Object value) throws Exception {
final Method setter = setter(bean.getClass(), name);
if (null == setter) {
throw new NoSuchMethodException("Setter of " + name);
}
setter.setAccessible(true);
setter.invoke(bean, value);
}
/**
* Returns the getter of the specified property
*
* @param clazz
* The class of bean
* @param name
* The property name
* @return the getter or null if exception occurred
*/
public static Method getter(final Class> clazz, final String name) {
try {
return clazz.getDeclaredMethod("get" + name.substring(0, 1).toUpperCase() + name.substring(1));
} catch (final Exception e) {
try {
final Method getter = clazz
.getDeclaredMethod("is" + name.substring(0, 1).toUpperCase() + name.substring(1));
final Type type = getter.getReturnType();
if (boolean.class.equals(type) || Boolean.class.equals(type)) {
return getter;
}
} catch (final Exception ignore) {
}
return null;
}
}
/**
* Returns the setter of the specified property
*
* @param clazz
* The class of bean
* @param name
* The property name
* @return the setter or null if exception occurred
*/
public static Method setter(final Class> clazz, final String name) {
try {
final Method setter = clazz
.getDeclaredMethod("set" + name.substring(0, 1).toUpperCase() + name.substring(1));
if (setter.getParameterTypes().length == 1) {
return setter;
}
} catch (final Exception e) {
}
return null;
}
private static Map object2map(final Object bean, boolean includeSuperClass) {
final Map map = new TreeMap();
final Class> klass = bean.getClass();
if (klass.getClassLoader() == null) {
includeSuperClass = false;
}
final Method[] methods = (includeSuperClass) ? klass.getMethods() : klass.getDeclaredMethods();
for (int i = 0; i < methods.length; i += 1) {
try {
final Method method = methods[i];
final String name = method.getName();
String key = "";
if (name.startsWith("get")) {
key = name.substring(3);
} else if (name.startsWith("is")) {
key = name.substring(2);
}
if (key.length() > 0 && Character.isUpperCase(key.charAt(0))
&& method.getParameterTypes().length == 0) {
if (key.length() == 1) {
key = key.toLowerCase();
} else if (!Character.isUpperCase(key.charAt(1))) {
key = key.substring(0, 1).toLowerCase() + key.substring(1);
}
final Object result = method.invoke(bean);
if (result == null) {
map.put(key, null);
} else if (result.getClass().isArray()) {
final List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy