准备一个被反射的Bean
final public class RelectionTest {
private String name;
public int age;//准备一个公开的成员变量
private boolean gender;
private String desc;
public RelectionTest(){}
public RelectionTest(String name, int age) {
this.name = name;
this.age = age;
}
···
public void setName(String name) {
this.name = name;
}
/**
* 特意准备一个私有方法
*/
private String getDesc() {
return desc;
}
private void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "RelectionTest{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", desc='" + desc + '\'' +
'}';
}
1.获取指定构造函数并创建对象
Class rc = Class.forName("com.stu.java.reflection.RelectionTest");
//1.选定构造函数类型创建对象-------------
Class[] paramsType = new Class[2];
paramsType[0] = String.class;
paramsType[1] = int.class;
Constructor constructor = rc.getConstructor(paramsType);
//准备构造参数 值
Object[] args = new Object[2];
args[0] = "obj";
args[1] = 101;
Object obj = constructor.newInstance(args);
LogUtils.sysPrintln(obj.toString());
// RelectionTest{name='obj', age=101, gender=false, desc='null'}
2.调用公|私方法
Object objM = rc.newInstance();//注意 是否支持无参构造,否则会抛出 创建实例异常:InstantiationException
LogUtils.sysPrintln(objM.toString());
// RelectionTest{name='null', age=0, gender=false, desc='null'}
//指定参数类型
Class[] mPt1 = {String.class};
//获取对应方法
Method setNameMethod = rc.getMethod("setName",mPt1);
//呼叫方法
setNameMethod.invoke(objM,"objM");
Method setAgeMethod = rc.getMethod("setAge", int.class);//这都直接有代码提示了。。。
setAgeMethod.invoke(objM,99);
//获取一个私有方法
Method setDescMethod = rc.getDeclaredMethod("setDesc", String.class);
setDescMethod.setAccessible(true);//true 取消java语言检查,flase 反之使用
setDescMethod.invoke(objM,"反射呼叫 setDesc方法");
//获取一个私有方法-优化
Method getDescMethod = rc.getDeclaredMethod("getDesc");
if(Modifier.isPrivate(getDescMethod.getModifiers())){
getDescMethod.setAccessible(true);
}
Object desc = getDescMethod.invoke(objM);
LogUtils.sysPrintln("desc=%s",desc);
LogUtils.sysPrintln(objM.toString());
// RelectionTest{name='objM', age=99, gender=false, desc='反射呼叫 setDesc方法'}
3.修改公|私成员变量的值
Object objF = rc.newInstance();
Field ageF = rc.getField("age");
if(ageF.getType()==int.class){
ageF.setInt(objF,101);
}
//同获取私有方法一样,如果是私有限制 则不能直接用getField 要用 getDeclareField
Field nameF = rc.getDeclaredField("name");// 又自动补全了。。。。一直补一直爽
if(Modifier.isPrivate(nameF.getModifiers())){
nameF.setAccessible(true);
}
//这里应当 根据不同type 来调用对应的赋值方法,这里因为我们知道这个成员类型为String.class 所以偷懒省去
nameF.set(objF,"objF");
LogUtils.sysPrintln(objF.toString());
// RelectionTest{name='objF', age=101, gender=false, desc='null'}
END
参考:https://github.com/HarkBen/JavaSE6Tutorial/blob/master/docs/CH16.md