反射理解
反射是针对类Class. Class又可以做什么呢?
Class 可以知道类里面的属性, 方法. 知道方法又可以做什么呢?
知道方法可以反过来调用实体类.
一般过程 object.method ( 实体类+ . + 方法名) 调用方法
反射过程 method.invoke(object) (方法名.invoke(实体类))
反射应用
框架都是在反射的基础上搭建的,Spring, mybatis等流行框架.
然而对我们有什么关系呢?
在实际应用上,反射能帮我们减少很多工作,简化代码,构建清晰通用代码.
反射实例
基本bean类
public class Source {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试方法
public static void main(String[] args) {
try {
Source source = new Source();
source.setId(1);
Method setNameMethod = Source.class.getMethod("setName", String.class);
setNameMethod.invoke(source, "xlroce");
String name = source.getName();
Method getIdMethod = Source.class.getMethod("getId");
Integer id = (Integer) getIdMethod.invoke(source);
System.out.println("name : " + name);
System.out.println("id : " + id);
} catch (Exception e) {
e.printStackTrace();
}
}
注意 : class.getMethod(方法名, 参数类型) , 因为java是多态的,因此你要确定你要获得的是哪一个.
一般人一般也不会这么操作方法,But 我们是程序猿.^_^
举个栗子
场景: 现在传入一个实体Bean 你要获得他的所有属性
So easy : source.getId() source.getName();
OK?
OK
But 能做成工具类吗?
额......
Here is the xxxing code
public static void printSimpleBeanValue(Object object, Class clazz){
Method methods[] = clazz.getMethods();
for( Method method : methods){
if("get".equals(method.getName().substring(0, 3))){
try {
Object value = method.invoke(object);
System.out.println( value.toString() );
} catch (Exception e){
e.printStackTrace();
}
}
}
}