开发工具与关键技术:Java/MyEclipse 10
作者:张俊辉
撰写时间:2019年08月18日
本文章关于反射需要用到的方法函数有:
newInstance:创建对象的方法,
getMethod:返回一个 Method 对象,它反映此 Class 对象所表示的类或接 口的指定公共成员方法。
getDeclaredField:返回一个 Field 对象,该对象反映此 Class 对象所表示的类或 接口的指定已声明字段。
getSuperclass:返回表示此Class所表示的实体(类、接口、基本类型或 void)的超类(直接继承的父类)的Class。
关于ResultSet用到的方法:
ResultSetMetaData metaData=rs.getMetaData();:得到结果集(rs)的结构,比如字段数、字段名等。
int count =metaData.getColumnCount();:获取结果集列数。
代码如下:
public static <T> List<T> GetListDate(ResultSet rs,Class<T> obj){
List<T> list = new ArrayList<T>();
try {
//得到结果集(rs)的结构,比如字段数、字段名等。
ResultSetMetaData metaData=rs.getMetaData();
//获取结果集列数int count =metaData.getColumnCount();
while(rs.next()){
//声明对象T t=obj.newInstance();
for (int i = 1; i <= count; i++) {
//---获取列名String name = metaData.getColumnName(i);
// 首字母小写
String name2 = name.substring(0, 1).toLowerCase() + name.substring(1);
try {
//获取列名在该类中对应的字段的数据类型
Class<?> type=GetType(obj,name2);
//---获取setter方法
Method setMethod = obj.getMethod("set" + name, type);
//---判断读取数据的类型
if (type.isAssignableFrom(String.class)) {
setMethod.invoke(t, rs.getString(name));
}else if (type.isAssignableFrom(int.class)||
type.isAssignableFrom(Integer.class)) {
setMethod.invoke(t, rs.getInt(name));
}else if (type.isAssignableFrom(Boolean.class) ||
type.isAssignableFrom(boolean.class)) {
setMethod.invoke(t, rs.getBoolean(name));
}else if (type.isAssignableFrom(Double.class) ||
type.isAssignableFrom(double.class)) {
setMethod.invoke(t, rs.getDouble(name));
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}list.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}return list;
}
@SuppressWarnings("unchecked")
public static <T> Class<?> GetType(Class<T> obj,String name){
Class<?> type=null;
try {
//---获取该类字段的数据类型
type = obj.getDeclaredField(name).getType();
} catch (NoSuchFieldException e) {
//因getDeclaredField获取的字段不包括所继承父类的字段
Class<T> obj2=(Class<T>)obj.getSuperclass();
if(obj2!=null){
//调用当前方法
type=GetType(obj2,name);
}
}return type;
}