【Java】第三十节 反射机制操作构造方法、普通方法和属性

反射机制操作构造方法:

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);
发布了128 篇原创文章 · 获赞 17 · 访问量 2754

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/103877775