获取成员方法,并传值调用
package com.shujia.day21;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
/*
通过反射获取成员方法,并传值调用
获取所有方法
getMethods 获取自己以及父类中所有的公共的成员方法
getDeclaredMethods 自己的所有成员方法,包括私有,不包括父亲的。
获取单个方法
getMethod
getDeclaredMethod
使用获取的方法
Method.invoke(Object object) 需要指定具体类的对象
暴力访问
method.setAccessible(true); 使用哪个方法,哪个方法进行暴力访问
*/
public class MethodDemo1 {
public static void main(String[] args) throws Exception {
//先通过反射将对象创建出来
//获取类的字节码文件对象
Class<?> studentClass = Class.forName("com.shujia.day21.Student");
//通过类的字节码文件对象获取类的构造方法
Constructor<?> c1 = studentClass.getConstructor();
//通过获取的构造方法创建类的对象
//创建这个对象的目的是访问成员的,被访问的成员方法是一个独立的个体,使用时需要指定哪一个类
Object o = c1.newInstance();
Method fun1 = studentClass.getMethod("fun1");
System.out.println(fun1);
// Method fun4 = studentClass.getMethod("fun4");
// System.out.println(fun4);
Method fun4 = studentClass.getDeclaredMethod("fun4");
System.out.println(fun4);
System.out.println("------------------------------");
Method[] methods = studentClass.getMethods(); //获取自己以及父类中所有的公共的成员方法
System.out.println(Arrays.toString(methods));
System.out.println("------------------------------");
Method[] m2 = studentClass.getDeclaredMethods(); //自己的所有成员方法,包括私有,不包括父亲的。
System.out.println(Arrays.toString(m2));
System.out.println("------------------------------");
//使用获取的方法
fun1.invoke(o);
System.out.println("------------------------------");
fun4.setAccessible(true);
fun4.invoke(o);//需要指定具体的类
System.out.println("------------------------------");
//获取带参数的公共方法,并使用该方法
Method fun11 = studentClass.getMethod("fun1", String.class);
Object o2 = fun11.invoke(o, "魏一民"); // 数加:魏一民
System.out.println(o2);
}
}
类
package com.shujia.day21;
public class Student {
private String name;
int age;
protected String address;
public int phoneNum;
public Student() {
}
public Student(String s) {
System.out.println("带参数的公共构造方法" + s);
}
protected Student(int i) {
System.out.println("带参数的受保护构造方法" + i);
}
Student(double d) {
System.out.println("带参数的默认修饰符构造方法" + d);
}
private Student(String name, int age) {
System.out.println("带参数的私有构造方法" + name + "," + age);
}
public void fun1() {
System.out.println("这是公共的成员方法");
}
public String fun1(String s) {
System.out.println("这是公共的成员方法" + s);
return "数加:" + s;
}
protected void fun2(){
System.out.println("这是受保护的成员方法");
}
void fun3(){
System.out.println("这是默认的成员方法");
}
private void fun4(){
System.out.println("这是私有的成员方法");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", phoneNum=" + phoneNum +
'}';
}
}