S要想使用反射,所有的反射都指向一个类:java.lang.Class
- 得到反射类
这里有三种方式可以得到:
- 通过对象来获取
Class cls = master.getClass();
- 通过类来获取
Class cls = Master.class;
- 通过字符串,来得到Class对象,这种方式是我们使用最广泛的一种方式,如Hibernate,mybatis的映射文件
Class cls = Class.forName("cn.jbit.po.Master");
- 根据得到的Class对象,获得相应的Master对象
- 调用无参构造,来获得对象
Master master = (Master) cls.newInstance();
- 先获得指定的构造,然后利用这个构造方法,来获得对象
//得到指定的构造 方法,如果有多个参数,中间用","隔开
Constructor con = cls.getDeclaredConstructor(String.class,Integer.class);
//当没有无参构造,或者无参构造为private修饰的时候,我们不能够再使用newinstance的方式来实例化了
//这时候,我们只能先获取指定构造,然后再来实例化
Object obj = con.newInstance("abc",1);
- 获得构造
//获得所有的构造方法,private修饰的构造不能获得
Constructor[] cons = cls.getConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//获得本类所有的构造方法,包括private修饰的构造
Constructor[] cons = cls.getDeclaredConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//得到指定的构造 方法,如果有多个参数,中间用","隔开
Constructor con = cls.getDeclaredConstructor(String.class,Integer.class);
//也可以使用另一种方式来获得:cls.getConstructor(parameterTypes)
- 获得方法
//获得所有的方法,包括继承自父类的方法,但只能是public 修饰的方法
Method[] ms = cls.getMethods();
for(int i=0;i<ms.length;i++){
System.out.println(ms[i]);
}
//获得本类所有的方法,不包括继承自父类的方法,但private 修饰的方法也能获得
Method[] ms = cls.getDeclaredMethods();
for(int i=0;i<ms.length;i++){
System.out.println(ms[i]);
}
//获得指定方法(无参)
Method ms = cls.getDeclaredMethod("show");
System.out.println(ms);
//获得指定方法(有参)
Method ms = cls.getMethod("print", String.class);
System.out.println(ms);
//通过invoke调用方法,obj表示在哪个对象里调用方法,后续的参数都是方法的传入的参数
String str = (String) ms.invoke(obj, "测试有参方法");
System.out.println("方法执行的结果:"+str);
//获得指定方法(无参)
Method ms = cls.getDeclaredMethod("show");
System.out.println(ms);
//因为show()方法为私有化方法,所以需要先解除封装后,才能调用
ms.setAccessible(true);
ms.invoke(obj);
- 管理属性
//获得所有的public修饰的属性(继承自父类的属性也能获得),private修饰的属性不能获得
Field [] fs = cls.getFields();
for(int i=0;i<fs.length;i++){
System.out.println(fs[i]);
}
//获得本类所有的属性(继承自父类的属性不能获得),private修饰的属性也能获得
Field [] fs = cls.getDeclaredFields();
for(int i=0;i<fs.length;i++){
System.out.println(fs[i]);
}
//获得指定的属性
Field f = cls.getDeclaredField("mastername");
//mastername属性为私有的,所以要先解除封装
f.setAccessible(true);
System.out.println(f.get(obj));
//修改指定的属性
Field f = cls.getDeclaredField("mastername");
f.setAccessible(true);
f.set(obj, "lisi");
System.out.println(f.get(obj));