Java的invoke方法[通俗易懂]

Java的invoke方法[通俗易懂]如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。invoke方法是干什么的?有什么具体用途?首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有

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

如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。

invoke方法是干什么的?有什么具体用途?

首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。

invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。

但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有一句话Java没有反射,那么很多框架都不会存在。

我们经常new 对象出来,但是new的前提是你知道你到底需要什么对象,你才能new,然而不管是代码还是现实生活都有未知性,也就是直到程序运行时受条件限制才知道什么类,什么方法。

反射解决的这个问题,运行时获取对象结构,调用方法。
Method这个类就是关于反射调用方法的
下图是Method类的官方注解
在这里插入图片描述
大概意思就是说提供类或者接口的方法信息,就可以访问调用对应的方法。

invoke的意思上就有调用的意思,也就是说我们可以通过反射包下的Method类调用invoke方法,调用我们所提供的方法以及调用方法的参数来完成动态调用。

也就是根据你给的对象/实例,方法名,以及参数来调用。找了个“替身”来帮你调用方法。

2 invoke方法的使用
实际上invoke方法的使用,和我们常见的有所区别。

我们经常创建一个对象A,A对象里面的方法getA()方法,然后A.getA()

我们采用新的方式调用
(1)弄一个方法的“替身”(其实就是构建一个Method对象,让这个Method对象来代替你现在要用的方法)
(2)然后给替身需要的对象和参数,让替身去替你调用(像JOJO的替身替你去战斗)

具体代码演示如下:

public class InvokeTest {
    public void test(String[] arg){
        for (String string : arg) {
            System.out.println("zp is " + string);
        }
    }
    @Test
    public void invokeDemo() throws Exception {
        //获取字节码对象,这里要填好你对应对象的包的路径
        Class<InvokeTest> clazz = (Class<InvokeTest>) Class.forName("com.example.zp.demo.testDemo.InvokeTest");
        //形式一:获取一个对象
//        Constructor con =  clazz.getConstructor();
//        InvokeTest m = (InvokeTest) con.newInstance();
        //形式二:直接new对象,实际上不是框架的话,自己写代码直接指定某个对象创建并调用也可以
        InvokeTest m = new InvokeTest();
        String[] s = new String[]{"handsome","smart"};
        //获取Method对象
        Method method = clazz.getMethod("test", String[].class);
        //调用invoke方法来调用
        method.invoke(m, (Object) s);
    }

所以使用invoke方法要比别的方法多做一步,就是构建一个Method对象,这个对象替代的是现在程序要调用方法的替代品。

而且除了参数以外,invoke还会多要一个对象,因为方法调用需要对象,所以invoke要想调用的目标方法,就需要目标方法的需要的对象。

看起来invoke方法不仅比平常方法直接调用要麻烦很多,但是你有想过吗,我只需要输入参数,我可以调用替代各种方法,在未知的情况下,根据条件决定去调用什么对象,什么方法,一下子就让代码变得灵活,这不仅是invoke的妙处,也是整个反射的妙处,在程序运行时根据条件灵活使用。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql中not exists用法_not exists用法

    mysql中not exists用法_not exists用法notexists是sql中的一个语法,常用在子查询和主查询之间,用于条件判断,根据一个条件返回一个布尔值,从而来确定下一步操作如何进行,notexists也是exists或in的对立面。notexists是exists的对立面,所以要了解notexists的用法,我们首先了解下exists、in的区别和特点:exists:强调的是是否返回结果集,不要求知道返回什么,比如:sele…

    2022年7月15日
    11
  • apache 负载均衡 超时设置_apache负载均衡配置

    apache 负载均衡 超时设置_apache负载均衡配置最近因为新疆移动项目的要求,必须要用负载均衡来实现HTTP请求,没办法,我这个人一般是有压力的环境下才会好好学习,所以只有老实的自己来边学边写了。   其实,我们在平时经常听说集群这个名词,但是真正知道的又有几个呢,恩,好了,不讲废话了,我就先给大家扫盲吧,当然,我讲的不一定是对的,我就把我自己知道的讲出来,集群目前分3类吧,科学集群、高可用性集群、负载均衡集群。    科学集群(ScientificClustering,简称SC):使用特殊的软硬件技术将大量的计算能力有限的机器连接成计算能力巨大

    2022年9月4日
    4
  • Nginx部署Vue项目以及解决刷新页面404问题「建议收藏」

    Nginx部署Vue项目以及解决刷新页面404问题

    2022年2月18日
    42
  • Java字符串匹配_获取字符串

    Java字符串匹配_获取字符串文章目录一、示例二、解释1.replace()方法2.replaceAll()方法3.replaceFirst()方法4.常用的字符列表一、示例如图,都是为了替换字符串s中的”(“符号,但三种匹配方法,有三种不同的效果及写法。二、解释1.replace()方法replace()方法没有用到正则表达式,但会匹配所有的参数并进行替换2.replaceAll()方法replaceAll()方法使用的是正则表达式来匹配,而括号在正则表达式中是特殊字符,所以需要用双斜杠来进行转义,同时会匹配所..

    2022年8月21日
    5
  • stm32f103c8t6数据手册「建议收藏」

    stm32f103c8t6数据手册「建议收藏」STM32F103ZET6(中文)-豆丁网(docin.com)https://www.docin.com/p-304006862.html?docfrom=rrela

    2022年10月15日
    1
  • jQuery操作table tr td

    jQuery操作table tr td

    2022年3月5日
    57

发表回复

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

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