获取成员方法,并传值调用

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 +
                '}';
    }
}
posted @ 2024-08-23 21:45  ていせい  阅读(4)  评论(0编辑  收藏  举报