利用反射取得类中属性(引用及非引用数据类型)及设置该类实例化对象的属性值
2016-04-14 16:29
1071 查看
第一次尝试将自己学习中的收获记录下来,希望此举能够给自己带来方便或收获。
在做项目中,碰到一个问题:一个外界设备提供了一个包含该设备各项参数的类,因为不是自己所熟悉的设备(属性名),因此在开发中逐一设置太过于麻烦,因此想到了利用反射。
由于之前很少接触JAVA的反射机制,因此并不了解其具体操作,花时间大概熟悉了一下。由于项目的缘故,此次并没有深入了解,只是针对项目需要做了些功课。
下面是测试反射时使用的类的代码:
这个类仅设置了几个属性和一个构造方法。
利用反射机制获取的属性只能是public的,并且不能是static的。
下面是测试的主类:
下面是上述程序的运行效果:
本次对于反射只是做个初步了解,难免存在一些误差,有待于后续跟进、改正。
学习阶段,难免有些不足与错误,希望大家能够留言告知。
在做项目中,碰到一个问题:一个外界设备提供了一个包含该设备各项参数的类,因为不是自己所熟悉的设备(属性名),因此在开发中逐一设置太过于麻烦,因此想到了利用反射。
由于之前很少接触JAVA的反射机制,因此并不了解其具体操作,花时间大概熟悉了一下。由于项目的缘故,此次并没有深入了解,只是针对项目需要做了些功课。
下面是测试反射时使用的类的代码:
public class Bean { public String name; public String password; public int age; public Bean bean; public Bean(String name, String password, int age) { super(); this.name = name; this.password = password; this.age = age; } }
这个类仅设置了几个属性和一个构造方法。
利用反射机制获取的属性只能是public的,并且不能是static的。
下面是测试的主类:
import java.lang.reflect.Field; public class Main { public static void main(String[] args) { Bean bean = new Bean("nameString", "passwordString", 20); try { test(bean); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 测试利用反射取得类中属性(引用及非引用数据类型)及设置该类实例化对象的属性值 * * @param bean * 测试用的类 * @throws IllegalArgumentException * @throws IllegalAccessException */ private static void test(Bean bean) throws IllegalArgumentException, IllegalAccessException { Field[] fields = Bean.class.getFields(); // 取得类的属性数组 for (int i = 0; i < fields.length; i++) { System.out.println("*** : " + fields[i].getType()); System.out.print("\t" + fields[i].getName()); // Field的get()方法中的参数表示从哪里(对象)取得值 System.out.println("\t " + fields[i].get(bean)); // 当字段类型符合要求时,设置字段值 if ((fields[i].getType()).equals(Integer.TYPE)) {// 基本数据类型无class,仅以其相关联的引用类型的TYPE常量表示 // Field的set*()方法,第一个参数是字段所属对象,第二个为设置的字段值 fields[i].setInt(bean, 50); } else if ((fields[i].getType()).equals(String.class)) { fields[i].set(bean, "haha"); } else if ((fields[i].getType()).equals(Bean.class)) { fields[i].set(bean, new Bean("beanName", "beanPassword", 100)); } } System.out.println("***************************************"); // 输出修改之后的对象属性及属性值 for (int i = 0; i < fields.length; i++) { if ((fields[i].getType()).equals(Bean.class)) { System.out.println("*** : " + fields[i].getType()); Bean b = (Bean) fields[i].get(bean); System.out.println("\t" + b.name + " | " + b.password + " | " + b.age); } else { System.out.println("*** : " + fields[i].getType()); System.out.print("\t" + fields[i].getName()); System.out.println("\t " + fields[i].get(bean)); } } } }
下面是上述程序的运行效果:
本次对于反射只是做个初步了解,难免存在一些误差,有待于后续跟进、改正。
学习阶段,难免有些不足与错误,希望大家能够留言告知。
相关文章推荐
- Ajax例子,views返回,html接收数据
- HTML5 五子棋 - JS/Canvas 游戏
- 树结点的简单练习
- 二叉排序树(BST)创建,删除,查找操作
- URL链接中文参数乱码的若干处理方法
- tesseract的编译安装
- 静态变量static
- 如何在spring中获取request对象
- 关于怎么打开/data目录查看SharedPreferences数据文件
- 11的阶乘
- json样式转化
- android 数据库 sqlite数据类型(时间 日期 double等)
- strstr()函数自实现
- HM编码器代码阅读(12)——CU编码
- 统计信息自动更新导致查询超时
- 阿里云服务器centos7 下安装配置svn服务器
- 在jsp中指定容器为combogrid onselect事件不执行
- 10个随机数相加
- 【转】android ListView详解
- 浮点数转byte数组