JAVA反射机制是在
运行状态中,对于任意一个
类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射在Java中的运用可谓是满地皆是,最典型的就是我们所熟悉的各种ORM框架了,SQL查出来的数据映射成一个Pojo对象,Pojo对象转换成SQL,Spring中实现AOP也用到反射等等。
下面来做一个简单的ORM映射,我们这里使用Map代替SQL查出来的数据。
package test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class ReflectTest {
public static void main(String[] args) throws Exception {
Map sqlResult = new HashMap();
sqlResult.put("name", "张三");
sqlResult.put("age", 25);
String pojoClassName = "test.Man";
Class c = Class.forName(pojoClassName);
Method[] methods = c.getDeclaredMethods();
Object o = c.newInstance();
//根据方法名
for(Method m:methods){
if(m.getName().matches("set[0-9a-zA-Z_]*")){
String name = m.getName().replaceFirst("set", "");
name = (name.substring(0,1).toLowerCase()).concat(name.substring(1));
m.invoke(o, sqlResult.get(name));
}
}
System.out.println(o);
//根据字段名
Field[] fields= c.getDeclaredFields();
Object o2 = c.newInstance();
for(Field f:fields){
f.setAccessible(true);
String name = f.getName();
Object value = sqlResult.get(name);
f.set(o2, value);
}
System.out.println(o2);
}
}
class Man{
private String name;
private int age;
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;
}
@Override
public String toString() {
return "name:"+name+"\n"+"age:"+age;
}
}
运行结果: