反射
1前言:
在Spring的jdbc中使用了JdbcTemplate类,这个类在查询语句时,会有个List类型的结果,但是List类型中的元素是Map,Map中的key是表的列名。当然这是Spring的jdbc不被很看好的原因之一,因为这太不方便了。(注:可参考Spring API中JdbcTemplate: queryForList(String sql,Object[] args)的解释)
但是,BBP项目中使用了这个JdbcTemplate,所以现在要对返回回来的List进行封装处理,要用到反射,所以,下面总结一下反射操作:
1) 在本项目中,是使用Class获取fields,然后,从fields出发,使用Method类中的invoke方法,进行赋值。
2) 而我在没有先看本项目的操作前,自己写了反射操作,是使用Class获取methods,然后,从methods出发,使用Method类中的invoke方法,进行赋值。感觉不错,说明我会使用反射了。感觉太棒了!!!
2. BBP项目中的反射例子可以参看:
com.innov8tion.dao.jdbc. CategoryDAOImpl中的getCategoryList方法中的BeanUtil类。
3. 下面是我的反射例子的步骤:
1) 首先我写了个User对象。
2) 然后写了个测试程序,大体思想是:在Map中,key是User对象的字段,value是自己定义的某个值。然后,使用反射来对User对象赋值。
4. 以下贴出我的反射例子的源码:
1) User类:
public class User {
private int user_id;
private String first_name;
private String last_name;
private int age;
private int status;
private Date create_time;
public User(){
}
public User(int user_id, String first_name, String last_name, int age, int status, Date create_time){
setUser_id(user_id);
setFirst_name(first_name);
setLast_name(last_name);
setAge(age);
setStatus(status);
setCreate_time(create_time);
}
public String toString(){
return "user_id = " + getUser_id() + "/n"
+ "first_name = " + getFirst_name() + "/n"
+ "last_name = " + getLast_name() + "/n"
+ "age = " + getAge() + "/n"
+ "status = " + getStatus() + "/n"
+ "create_time = " + getCreate_time();
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
}
2) 测试类testReflection:
public class testReflection {
public static void main(String[] args){
Map<String, Object> map = new HashMap<String, Object>();
map.put("user_id", 1);
map.put("first_name", "wangle");
map.put("last_name", "le");
map.put("age", 23);
map.put("status", 0);
map.put("create_time", new Date());
testReflection reflection = new testReflection();
User user = (User)reflection.getBeanFromMap(map, User.class);
System.out.println(user.toString());
}
public Object getBeanFromMap(Map<String, Object> map, Class c) {
Object object = null;
try{
object = c.newInstance();
Method[] methods = c.getDeclaredMethods();
for(Method method : methods){
String modifier = Modifier.toString(method.getModifiers());
if(!modifier.contains("public")){
continue;
}
String methodName = method.getName();
if(!methodName.startsWith("set")){
continue;
}
String fieldName = String.valueOf(methodName.charAt(3)).toLowerCase()
+ methodName.substring(4);
if(map.containsKey(fieldName)){
method.invoke(object, map.get(fieldName));
}
}
}catch(Exception e){
System.out.println(e.getMessage());
}
return object;
}
}