反射机制操作构造方法:
1、获取构造方法:
getConstructor():
只能获取public权限的构造方法,否则报错,有参数的话将参数类型写在括号里,通过括号内的参数类型与参数个数区分获取哪个构造方法,例:
//Class实例clazz中的无参构造方法
Constructor constructor = clazz.getConstructor();
//Class实例clazz中的有参构造方法
constructor = clazz.getConstructor(String.class);
getDeclaredConstructor():
获取构造方法而不考虑构造方法的访问权限,通过括号内的参数类型与参数个数区分获取哪个构造方法,例:
//Class实例clazz中的无参构造方法
Constructor constructor = clazz.getDeclaredConstructor();
//Class实例clazz中的有参构造方法
constructor = clazz.getDeclaredConstructor(String.class);
获取所有构造方法组成的数组:
例:
//获取所有public访问权限的构造方法组成的数组
Constructor[] constructors = clazz.getConstructors();
//获取所有构造方法组成的数组,忽略访问权限
constructors = clazz.getDeclaredConstructors();
2、获取构造方法的信息:
获取当前constructor所属类对应的Class实例:
clazz = constructor.getDeclaringClass();
获取当前constructor的访问权限:
int i = constructor.getModifiers();
String res = Modifier.toString(i);
获取当前constructor的方法名:
constructor.getName()
获取当前constructor的参数类型对应的Class实例:
Class[] classes = constructor.getParameterTypes();
for (Class cla : classes) {
System.out.println(cla);
}
3、调用构造方法:
非public构造方法调用的前提条件:
如果构造方法不是public,获取构造方法的方法必须使用getDeclaredConstructor(),并且在使用之前,要将其变为可访问,也就是说要加上以下代码:
constructor.setAccessible(true);
利用反射机制获取的构造方法实例化对象:newInstance(参数…)
newInstance方法的括号内输入该构造方法所需实参,newInstance方法返回值是Object类型,例:
Object object = constructor.newInstance("李四");
反射机制操作普通方法:
1、获取普通方法:
getMethod(参数1,参数2,…):
参数1为方法名,后面的参数为该方法的形参对应的类型,该方法只能获取访问权限是public的方法,包括该Class实例对应类的父类中的方法,例:
//获取本类中访问权限为public的名为“doHomework”的方法
Method method = clazz.getMethod("doHomework",String.class);
//获取本类的父类中名为“toString”的普通方法
method = clazz.getMethod("toString");
getDeclaredMethod(参数1,参数2,…):
参数1为方法名,后面的参数为该方法的形参对应的类型,该方法可以获取所有访问权限的方法,但不能获取该Class实例对应类的父类中的方法,例:
//获取本类中名为“doHomework”的方法
Method method = clazz.getDeclaredMethod("doHomework",String.class);
//由于本类没有重写父类的toString方法,所以程序执行到此处会报错
method = clazz.getDeclaredMethod("toString");
获取所有普通方法组成的数组:
例:
//获取本类中所有public访问权限的普通方法组成的数组,包括父类中的方法
Method[] methods = clazz.getMethods();
//获取本类中所有普通方法组成的数组,忽略访问权限,但不包括父类中的方法
methods = clazz.getDeclaredMethods();
2、获取普通方法的信息:
获取当前method所属类对应的Class实例:
method.getDeclaringClass();
获取当前method的修饰符:
int i = method.getModifiers();
System.out.println(Modifier.toString(i));
获取当前method的方法名:
method.getName();
获取当前method的参数类型对应的Class实例:
Class[] classes = method.getParameterTypes();
for (Class cla : classes) {
System.out.println(cla);
}
3、调用普通方法:
非public普通方法调用的前提条件:
如果构造方法不是public,获取构造方法的方法必须使用getDeclaredMethod(),并且在使用之前,要将其变为可访问,也就是说要加上以下代码:
method.setAccessible(true);
调用反射机制获取的普通方法:invoke(参数1,参数2…)
参数1的类型是对象,用于指定调用哪个对象中的方法,后面的参数为该方法所需实参,方法的返回值是Object类型,例:
Object object = method.invoke(constructor.newInstance(), "张三");
反射机制操作属性:
1、获取属性:
getField(参数):
参数为属性名,该方法只能获取访问权限是public的属性,包括该Class实例对应类的父类中的属性,例:
Field field = clazz.getField("name");
getDeclaredField(参数):
参数为属性名,该方法可以获取所有访问权限的属性,但不包括该Class实例对应类的父类中的属性,例:
Field field = clazz.getDeclaredField("name");
getFields():
该方法只能获取访问权限是public的属性组成的数组,包括该Class实例对应类的父类中的属性,例:
Field[] fields = clazz.getFields();
getDeclaredFields():
该方法可以获取所有访问权限的属性组成的数组,但不包括该Class实例对应类的父类中的属性,例:
Field[] fields = clazz.getDeclaredFields();
2、获取属性的信息:
获取其所在的类对应的Class实例:
field.getDeclaringClass();
获取当前属性的修饰符:
int i = field.getModifiers();
System.out.println(Modifier.toString(i));
获取当前属性的类型对应的Class实例:
field.getType();
3、查看与修改属性:
设置属性值:
Student student = new Student();
field.set(student, "孙悟空");
查看属性值:
Student student = new Student();
Object object = field.get(student);
System.out.println(object);