黑马程序员 Java中反射的应用

来源:互联网 发布:java的变量使用范围 编辑:程序博客网 时间:2024/06/15 08:43

---------------------- android培训、java培训、期待与您交流! ----------------------

对于一个Javabean可以通过实例化的形式得到对象,也可以通过反射的原理得到对象,并且给对象赋值

最基本的反射方法获取类字节码通过getClass方法获取

下面介绍通过反射直接给对象赋值。

先定义一个Student 的JavaBean

public class Student {
private String name;
private int age;
private String sex;
private Date birthday;
public Student(){}
public Student(String name,int age,Date birthday)
{
this.name=name;
this.age=age;
this.birthday=birthday;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}

package com.reflect;import java.util.List;import java.lang.reflect.Field;import java.util.Date;import java.text.SimpleDateFormat;import java.util.ArrayList;public class ReflectTest {public static void main(String[] args) throws RuntimeException, Exception {// 反射构造方法设定类中的值Student s = Student.class.getConstructor(new Class[] { String.class, int.class, Date.class }).newInstance(new Object[] { "李四", 32, new Date() });System.out.println(s.getName() + "::" + s.getAge() + "::"+ s.getBirthday());// 反射实例化对象Student stu = Student.class.newInstance();//得到对象中所有field属性//不用getMethods,因为javabean中还有其它继承至Object的方法Field[] fieldName = stu.getClass().getDeclaredFields();for (Field f : fieldName) {String name = f.getName();//得到为set+属性的方法名String methodName = "set" + name.substring(0, 1).toUpperCase()+ name.substring(1);//直接给方法注入参数if (int.class == f.getType()) {stu.getClass().getMethod(methodName, f.getType()).invoke(stu,19);}if (String.class == f.getType()) {stu.getClass().getMethod(methodName, f.getType()).invoke(stu,"张三");}if (Date.class == f.getType()) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d = (Date) sdf.parse("1988-5-5");stu.getClass().getMethod(methodName, f.getType()).invoke(stu, d);}}System.out.println(stu.getName() + "::" + stu.getAge() + "::"+ stu.getBirthday());}}

这就说明了通过set方法赋值和构造函数传参数是一样的。

这样做的好处在于,当你不知道这个类中有哪些属性时,都能设置进去,可以动态的加载一些SQL语句中查询出来的对象而不是将每行数据封装成一个固定的类


---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击