反射中Method类的invoke() 和getMethod()[通俗易懂]

反射中Method类的invoke() 和getMethod()[通俗易懂]就是调用类中的方法,最简单的用法是可以把方法参数化。invoke(class,method);  MethodClass.getMethod(Stringname,Class<?>…parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型…

大家好,又见面了,我是你们的朋友全栈君。

就是调用类中的方法,最简单的用法是可以把方法参数化。invoke(class, method);

 

 

Method Class.getMethod(String name, Class<?>… parameterTypes)的作用是获得对象所声明的公开方法

该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。

person.getClass().getMethod(“Speak”, null);

//获得person对象的Speak方法,因为Speak方法没有形参,所以parameterTypes为null

person.getClass().getMethod(“run”, String.class);

//获得person对象的run方法,因为run方法的形参是String类型的,所以parameterTypes为String.class

如果对象内的方法的形参是int类型的,则parameterTypes是int.class

 

//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法

 

Method method = XXX.getClass().getMethod(methodName,new Class[0]);

 //第一个参数是具体调用该方法的对象
 //第二个参数是执行该方法的具体参数反射中Method类的invoke() 和getMethod()[通俗易懂]    

 

如一个函数 int Test(int a, String str);

对应的getMethod方法:

1.  getMethod(“Test”,int.class,String.class);

2. getMethod(“Test”,new Class[]{int.class,String.class});

//Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,返回值总是对象。

 

 //如果参数为基本类型数据,必须转换为相应的包装类型的对象。

 

 

public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException

InvokeObj.java:

public class InvokeObj {

    public void show(){

        System.out.println(“无参show()方法”);
    }
    public void show(String name){

        System.out.println(“show方法:”+name);
    }
    public String[] arrayShow(String[] arr){

        return arr;
    }
    public String stringShow(String str){

        return str;
    }
    public int intShow(int sum){

        return sum;
    }
}
 

MethodInvokeTest.java:

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodInvokeTest {

    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

        
        Class<InvokeObj> clazz=InvokeObj.class;
        Method[] methods=clazz.getMethods();
        //输出了Class类型的所有方法。
        System.out.println(“以下输出InvokeObj类的方法”);
        for(Method method:methods){

            System.out.println(method);
        }
        System.out.println();
        
         System.out.println(“InvokeObj类的无参show()方法:”);
         Method method1=clazz.getMethod(“show”,null);
        //会执行无参show()方法
         Object obj=method1.invoke(new InvokeObj(),null);
         System.out.print(“输出无参show()方法的返回值:”+obj);
         System.out.println();System.out.println();
        
         System.out.println(“InvokeObj类的show()方法: “);  
         Method method2 = clazz.getMethod(“show”, String.class);
         Object obj1 = method2.invoke(new InvokeObj(), “hello,world”);  
           // System.out.println(“输出有参show()方法: “);
         System.out.println();
        
         System.out.println(“InvokeObj类的arrayShow()方法: “);  
         Method method3 = clazz.getMethod(“arrayShow”, String[].class);  
            String[] strs = new String[]{“hello”, “world”, “!”};  
            //数组类型的参数必须包含在new Object[]{}中,否则会报IllegalArgumentException  
            String[] strings = (String[]) method3.invoke(new InvokeObj(), new Object[]{strs});  
            for (String str : strings) {  
                System.out.println(“arrayShow的数组元素:” + str);  
            }
         System.out.println();   
        
         System.out.println(“InvokeObj类的StringShow()方法: “);  
            Method method4 = clazz.getMethod(“stringShow”, String.class);  
            String string = (String) method4.invoke(new InvokeObj(), “Thinking in java”);  
            System.out.println(“stringShow()方法的返回值: ” + string);  
            System.out.println();
            
            System.out.println(“InvokeObj类的intShow()方法: “);  
            Method method5 = clazz.getMethod(“intShow”, int.class);  
            int num = (Integer) method5.invoke(new InvokeObj(), 89);  
            System.out.println(“intShow()方法的返回值: ” + num);     
            
        
    }

}
反射中Method类的invoke() 和getMethod()[通俗易懂]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125281.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月19日 上午8:20
下一篇 2022年4月19日 上午8:40


相关推荐

  • Openclaw自己操作Claude code完整开发了TikTok爆款分析系统

    Openclaw自己操作Claude code完整开发了TikTok爆款分析系统

    2026年3月13日
    3
  • 多级时间轮定时器_时间轮与哈希表定时

    多级时间轮定时器_时间轮与哈希表定时时间轮简述顾名思义,时间轮就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用。因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽(即时间轮划分的区域)之中,就可以实现在运转到某个槽时,进行判断该定时器是否已经到达运行时间(需要判断是由于有的定时器并非在这一圈就需要运行,可能需要后面几圈才会运行。从图中也可以看出,每个槽中的定时器是以(双向)链表…

    2026年4月17日
    4
  • IE重新装ActiveX控件[通俗易懂]

    IE重新装ActiveX控件[通俗易懂]项目因版本升级,需要重新安装一次已经装过的ActiveX控件,安装步骤如下: IE–&gt;右键属性–》程序–》管理加载项–&gt;IE已经使用的加载项–》找到原来安装的控件–》更新ActiveX(需要事先讲新控件放到相关文件夹)。 推荐使用:IE安装好的ActiveX控件存放在C:\WINDOWS\DownloadedProgramFiles,先删除…

    2022年5月14日
    48
  • java list三种遍历方法性能比較

    java list三种遍历方法性能比較

    2021年9月1日
    61
  • Android 开源项目和文章集合(更新:2022.03.21)

    1.再见SharedPreferences,你好MMKV!https://mp.weixin.qq.com/s/VBMDIE0QHXQAMuIjon-Fjg

    2022年4月16日
    49
  • Linux 命令(24)—— mv 命令

    Linux 命令(24)—— mv 命令1 简介 mv 命令用来为文件或目录改名 或将文件或目录移入其它位置 如果将一个文件移到一个已经存在的目标文件中 则目标文件的内容将被覆盖 mv 命令可以用来将源文件移至一个目标文件中 或将一组文件移至一个目标目录中 源文件被移至目标文件有两种不同的结果 1 如果目标文件是目录 源文件会被移到此目录下 且文件名不变 当目标文件是目录时 源文件或目录参数可以有多个 则所有的源文件都会被移至目标目录中

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号