1 .主类 |
package s0401反射实例自动填充; |
import java.lang.reflect.Field; |
import java.util.HashMap; |
import java.util.Map; |
public class Main { |
public static void main(String[] args) throws Exception |
{ |
|
//资料库 |
Map<String,String> data= new HashMap<String,String>(); |
data.put( "name" , "fengwei" ); |
data.put( "age" , "19" ); |
data.put( "tel" , "909" ); |
|
|
//获得className 字符串的实例对象 |
Class s=Class.forName( "s0401反射实例自动填充.Users" ); //调用forName("X") 将导致名为 X 的类被初始化。properties中存放的是类的名称 |
|
//对象实例化 |
Object obj=s.newInstance(); |
|
//自动填充数据 |
autoFile(obj,data); |
|
//输出获得的实例对象 |
System.out.println(obj); |
|
} |
private static void autoFile(Object obj, Map<String, String> data) throws IllegalArgumentException, IllegalAccessException |
{ |
//获得填充数据中的所有字段,然后将此字段在数据源data中查询,如果有则填充 |
|
//获得字节码对象 |
Class a=obj.getClass(); |
|
//获得所有的私有字段 |
Field[] fields=a.getDeclaredFields(); |
|
for (Field f:fields) |
{ |
//在资料库中获得需要的数据 |
String value=data.get(f.getName()); //在资料库中查找有没有对应要填充的字段 |
//强制设置权限,不然无法改变值 |
f.setAccessible( true ); |
|
//如果有需要的字段就填充到obj中 |
if (value!= null ) |
{ |
f.set(obj, value); //填充值 |
} |
} |
} |
} |
2 .User类 |
package s0401反射实例自动填充; |
public class User { |
private String name; |
private String age; |
private String tel; |
|
|
public String getTel() { |
return tel; |
} |
public void setTel(String tel) { |
this .tel = tel; |
} |
public String getName() { |
return name; |
} |
public void setName(String name) { |
this .name = name; |
} |
public String getAge() { |
return age; |
} |
public void setAge(String age) { |
this .age = age; |
} |
@Override |
public String toString() { |
return "User [name=" + name + ", age=" + age + ", tel=" + tel + "]" ; |
} |
} |