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); } }
相关文章推荐
- Java反射代码--05.执行所有get方法
- java利用反射原理:根据某个对象的名称和方法去执行该方法。
- 遍历Java对象,并执行其中的方法(通过反射执行方法)
- java利用反射执行对象的方法
- java 反射机制 之 getMethod获取公有方法 getDeclaredMethod获取所有方法 然后invoke执行其所有方法
- java 利用反射获取类,实例化,并执行其内部方法
- Java反射学习总结二(用反射调用对象的私有属性和方法)
- C# 利用反射,遍历获得一个类的所有属性名,方法名,成员名.
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java链表的get方法遍历VS使用迭代器遍历
- Java反射获取一个类的所有get方法
- Java利用反射,将字符串拼成方法并执行
- java利用反射技术遍历某个对象的属性及属性值
- java之通过反射,来获得某对象的所有方法(类方法提取器)
- java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表
- Java利用反射自动封装成实体对象的方法
- Java反射代码--06.执行所有特定的set方法
- java反射执行pojo中的set/get方法
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java利用反射动态执行类方法