您的位置:首页 > 编程语言 > Java开发

Java反射学习(利用反射遍历链表并执行所有对象的所有get方法)

2014-09-09 18:42 609 查看
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/*
* 内容:对于Java泛型和反射的学习测试
* 日期:2014-09-09*/
public class ReflectTest<T> {
/*
* 利用了JAVA的反射机制,可以将放置在JAVA集合中并且符合一定条件的数据显示出来,其中数据的显示顺序就是在该对象class中的定义各字段的顺序
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。
* 此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据),
* 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"。
*/
public void ReflectTestRun(Collection<T> dataset) {// 这儿的T会报错,必须在定义class的时候添加上<T>
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
while (it.hasNext()) {
index++;
System.out.println("**************** " + index
+ " ****************");
T t = (T) it.next();
/* 方法一开始 */
System.out.println("---------------------方法一开始---------------------");
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();// t的对象所对应的所有的字段
for (short i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Object value = null;
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = "";
if (value instanceof Integer) {
int intValue = (Integer) value;
System.out.println(intValue);
} else if (value instanceof Float) {
float fValue = (Float) value;
System.out.println(fValue);
} else if (value instanceof Double) {
double dValue = (Double) value;
System.out.println(dValue);
} else if (value instanceof Long) {
long longValue = (Long) value;
System.out.println(longValue);
} else if (value instanceof Boolean) {
boolean bValue = (Boolean) value;
System.out.println(bValue);
} else if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
Date date = (Date) value;
textValue = sdf.format(date);
System.out.println(textValue);
} else if (value instanceof byte[]) {
} else {
// 其它数据类型都当作字符串简单处理
textValue = value.toString();
System.out.println(textValue);
}
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("---------------------方法一结束---------------------");
/* 方法一结束 */
/* 方法二开始 */
System.out.println("---------------------方法二开始---------------------");
Field[] fs = t.getClass().getDeclaredFields();// 获得所有属性
Class tCls = t.getClass();
for (Field field : fs) {
try{
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),tCls);
Method getMethod = pd.getReadMethod();// 获得get方法
Object value = getMethod.invoke(t);// 执行get方法返回一个Object
String textValue = "";
if (value instanceof Integer) {
int intValue = (Integer) value;
System.out.println(intValue);
} else if (value instanceof Float) {
float fValue = (Float) value;
System.out.println(fValue);
} else if (value instanceof Double) {
double dValue = (Double) value;
System.out.println(dValue);
} else if (value instanceof Long) {
long longValue = (Long) value;
System.out.println(longValue);
} else if (value instanceof Boolean) {
boolean bValue = (Boolean) value;
System.out.println(bValue);
} else if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
Date date = (Date) value;
textValue = sdf.format(date);
System.out.println(textValue);
} else if (value instanceof byte[]) {
} else {
// 其它数据类型都当作字符串简单处理
textValue = value.toString();
System.out.println(textValue);
}
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println("---------------------方法二结束---------------------");
/* 方法二结束 */
}
}
public static void main(String[] args) {
List<Student> dataset = new ArrayList();
ReflectTest<Student> rt = new ReflectTest<Student>();
// 这里rt的定义,可以使用ReflectTest<Student>,也可以使用ReflectTest,实践证明这两种没有差别
dataset.add(new Student(10000001, "张三", 20, true, new Date()));
dataset.add(new Student(20000002, "李四", 24, false, new Date()));
dataset.add(new Student(30000003, "王五", 22, true, new Date()));
rt.ReflectTestRun(dataset);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: