Java反射之调用方法

通过反射机制还可以调用方法,这与调用构造方法类似。调用方法需要使用Method对象,它对应着一 个方法,获得Method对象需要使用Class类的如下方法:

  • Method[] getMethods():返回所有公有方法Method对象数组。
  • Method[] getDeclaredMethods():返回所有方法Method对象数组。
  • Method getMethod(String name, Class… parameterTypes):通过方法名和参数类型返回公有方法 Method对象。参数parameterTypes是Class数组,指定方法的参数列表。
  • Method getDeclaredMethod(String name, Class… parameterTypes):通过方法名和参数类型返回方 法Method对象。参数parameterTypes同上。

现有一个Person类:

public class Person {
    public String name;
    public int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setNameAndAge(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

现在编写一个程序通过反射机制调用Person类setNameAndAge和getName方法,具体代码如下:

import java.lang.reflect.Method;

public class HelloWorld {
    public static void main(String[] args) {
        try{
            Class clz = Class.forName("Java反射机制.调用方法.Person");

//            调用默认构造方法
            Person person = (Person) clz.newInstance();
            System.out.println(person);

//            1.指定参数类型
            Class[] params = new Class[2];
//            第一个参数是String
            params[0] = String.class;
//            第二个参数是int
            params[1] = int.class;

//           2.获取setNameAndAge方法对象
            Method method = clz.getMethod("setNameAndAge",params);

//            3。设置传递参数
            Object[] argObjs = new Object[2];
//            第一个参数传递Tony
            argObjs[0] = "Tony";
//            第二个参数传递21
            argObjs[1] = 21;

//            4.调用setNameAndAge方法,person是要调用的对象,argObjs是设置要传递的参数值
            method.invoke(person,argObjs);
            System.out.println(person);

//            获取getName方法对象,该方法没有参数
            method = clz.getMethod("getName");
//            调用getName方法
            Object result = method.invoke(person);
            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

Person{name='null', age=0}
Person{name='Tony', age=21}
Tony

以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

发布了93 篇原创文章 · 获赞 10 · 访问量 5212

猜你喜欢

转载自blog.csdn.net/weixin_45366499/article/details/104548231
今日推荐