您的位置:首页 > 其它

利用反射取得类中属性(引用及非引用数据类型)及设置该类实例化对象的属性值

2016-04-14 16:29 1071 查看
第一次尝试将自己学习中的收获记录下来,希望此举能够给自己带来方便或收获。

在做项目中,碰到一个问题:一个外界设备提供了一个包含该设备各项参数的类,因为不是自己所熟悉的设备(属性名),因此在开发中逐一设置太过于麻烦,因此想到了利用反射。

由于之前很少接触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));
}
}
}
}

下面是上述程序的运行效果:



本次对于反射只是做个初步了解,难免存在一些误差,有待于后续跟进、改正。

学习阶段,难免有些不足与错误,希望大家能够留言告知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: