一,Java反射机制
1、是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。
2、由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定。在运行期仍然可以扩展
二,获得Class类的对象
使用类的class属性来获取该类对应的Class对象。举例: Student.class将会返回Student类对应的Class对象
调用对象的getClass()方法,返回该对象所属类对应的Class对象
使用Class类中的静态方法forName(StringclassName),该方法需要传入字符串参数。该字符串参数的值是某个类的全路径,也就是完整包名的路径
Class<?> a = Class.forName("day36.Student");
三,反射获取构造方法并使用
Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes):返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):返回单个构造方法对象
Constructor类中用于创建对象的方法
T newInstance(Object... initargs):根据指定的构造方法创建对象
当获得的构造方法是私有构造方法时,需要加上setAccessible(true)
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Class<?> a = Class.forName("day36.Student");
// 获得单个的指定的public的构造方法
// Constructor<?> con = a.getConstructor(String.class, int.class, String.class);
// Object o = con.newInstance("Tom",45,"man");
// System.out.println(o);
// 获得指定的构造方法
Constructor<?> dec = a.getDeclaredConstructor(String.class, int.class);
// 取消访问检查,这样才能用私有构造器
dec.setAccessible(true);
Object tom = dec.newInstance("Tom", 40);
System.out.println(tom);
// 获得public构造方法组成的数组
// Constructor<?>[] con = a.getConstructors();
// for(Constructor c:con){
// System.out.println(c);
// }
// 获得所有构造方法组成的数组
// Constructor<?>[] dec = a.getDeclaredConstructors();
// for(Constructor c:dec){
// System.out.println(c);
// }
}
四,反射获取成员变量并使用
跟上面的构造方法差不多,不过成员变量对象的数据类型为Field,所以
getField(),getFields(),getDeclaredField(),getDeclaredFields()
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> a = Class.forName("day36.Student");
Constructor<?> con = a.getConstructor();
Object obj = con.newInstance();
// 得到成员变量操作
Field nameField = a.getDeclaredField("name");
// 使用私有成员变量,需要取消访问检查
nameField.setAccessible(true);
Field ageField = a.getDeclaredField("age");
Field sexField = a.getField("sex");
// 给成员变量赋值操作,用Field类的set方法
nameField.set(obj,"Tom");
ageField.set(obj,40);
sexField.set(obj,"man");
System.out.println(obj);
}
五,反射获取成员方法并使用
同样的,成员方法对象的数据类型为Methond,所以
getMethond(),getMethonds(),getDeclaredMethond(),getDeclaredMethonds()
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<?> a = Class.forName("day36.Student");
Constructor<?> con = a.getConstructor();
Object obj = con.newInstance();
// 这是个带参有返回值的方法,后面的是返回值类型
Method methond4 = a.getMethod("methond4", String.class);
// 通过这个方法对象调用invoke方法,把Studen对象和想用的Student的方法需要的参数传进去,返回值是Object类型的
String s= (String) methond4.invoke(obj,"Tom");
System.out.println(s);
Method methond1 = a.getDeclaredMethod("methond1");
methond1.setAccessible(true);
methond1.invoke(obj);
}