上一章节说了反射中学习到的知识,现在通过实践来写一个动态创建类,以及获取动态设值的方法
class="java">public class ReflectProUtils {
/**
* 获取泛型中的类型
* 例如: List<String> 获取出的类型为 [String.class]
* 说明:
* 需要获取泛型的,必须通过继承等方式重新构建一个新类,传递泛型的类型
*
* 可查考
* @throws ClassNotFoundException
* @see BaseMapper
* */
@SuppressWarnings("rawtypes")
public static List<Class> getGenericsClass(Class thisClass) throws ClassNotFoundException{
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Type genType = thisClass.getGenericSuperclass();
List<Class> list= new ArrayList<Class>();
if (!(genType instanceof ParameterizedType)) {
list.add(Object.class);
return list;
}
//返回表示此类型实际类型参数的Type对象的数组
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
for(Type type : params){
list.add(
type2Class(type)
);
}
return list;
}
/**
* Type类型转换为Class类型
* */
public static Class type2Class(Type type) throws ClassNotFoundException{
String clsStr = type.toString();
String classStrPath = clsStr.substring(clsStr.indexOf(" ")+1 , clsStr.length());
if(int.class.getName().equals(classStrPath))
return int.class;
else if(Constants.BYTE_NAME.equals(classStrPath))
return byte.class;
else if(Constants.SHORT_NAME.equals(classStrPath))
return short.class;
else if(Constants.LONG_NAME.equals(classStrPath))
return long.class;
else if(Constants.FLOAT_NAME.equals(classStrPath))
return float.class;
else if(Constants.DOUBLE_NAME.endsWith(classStrPath))
return double.class;
else if(Constants.CHAR_NAME.equals(classStrPath))
return char.class;
else if(Constants.BOOLEAN_NAME.equals(classStrPath))
return boolean.class;
return Class.forName(classStrPath);
}
/**
* 获取类中的所有字段,包括私有字段
* @param Class
* @return {@link Field}
* */
@SuppressWarnings("rawtypes")
public static Field[] getAllFields(Class cls){
return cls.getDeclaredFields();
}
/**
* 只获取类中的公共方法,被public修饰的方法
* @param Class
* @return {@link Field}
* */
@SuppressWarnings("rawtypes")
public static Field[] getPublicFields(Class cls){
return cls.getFields();
}
/**
* 获取当前类下的所有get/set方法
* @param Class
* @return {@link Map} <方法名,方法>
* */
@SuppressWarnings("rawtypes")
public static Map<String,Method> getAllGSMethods(Class cls){
Map<String,Method> getSetMethodMap = new HashMap<String,Method>();
Method[] methods = cls.getDeclaredMethods();
for(Method method : methods){
String name = method.getName();
if(name.contains("get") || name.contains("set"))
getSetMethodMap.put(name, method);
}
return getSetMethodMap;
}
/**
* 获取所有的方法
* @param cls
* @return {@link Method}
* */
@SuppressWarnings("rawtypes")
public static Method[] getAllMethods(Class cls){
return cls.getDeclaredMethods();
}
/**
* 只获取公开的方法
* @param cls
* @return {@link Method}
* */
@SuppressWarnings("rawtypes")
public static Method[] getPublicMethods(Class cls){
return cls.getMethods();
}
/**
* 为对象执行set方法,进行赋值
* set_T_Properties_value
*
* @param fields 对象中的字段
* @param getSetMap get/set方法
* @param T 需要赋值的对象
* @param args 参数
* @throws Exception
* */
public static void setTProVal(Field field ,Object T,Object arg) throws Exception{
String name = field.getName();
try {
Method method = T.getClass().getMethod( "set" + StringUtil.toUpperCaseFirstOne(name), arg.getClass());
if(method != null){
method.invoke(T, arg);
}
} catch (NoSuchMethodException e) {
System.out.println("找不到对应参数类型的方法..请核对方法名和类型");
}
}
public static <T>void setTProVal(T bean,Map<String,T> param) throws Exception{
Field[] fields = getAllFields(bean.getClass());
for(Field field : fields){
field.setAccessible(true);
String name = field.getName();
Object val = param.get(name);
if(val != null){
setTProVal(field, bean, val);
}
}
}
/**
* 获取一个对象下面的字段对应的数据
* @param Field 字段
* @param obj 对象
* @throws Exception
* */
public static <T>Object getTProVal(Field field,T obj ) throws Exception{
String name = field.getName();
try {
Method method = obj.getClass().getMethod("get"+StringUtil.toUpperCaseFirstOne(name));
if(method != null){
return method.invoke(obj, null);
}
} catch (NoSuchMethodException e) {
System.out.println("找不到对应参数类型的方法..请核对方法名和类型");
}
return null;
}
/**
* 获取Field的类型
* @return
* @throws ClassNotFoundException
* */
public static Class getFieldType(Field field) throws ClassNotFoundException{
return type2Class(field.getType());
}
/**
* 判断某个类下是否有某个方法存在
* @param Class
* @param 方法名
* */
public static boolean hasMethod(Class cls , String methodName){
Map<String,Method> methodMap = getAllGSMethods(cls);
if(methodMap == null) return false;
else{
Method method = methodMap.get(methodName);
return method != null ? true :false;
}
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(int.class.getName());
}
}
?
?
?
?
?
?