对于反射中的invoke()方法的理解

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 对于反射中的invoke()方法的理解

点击上方“后端技术精选”,选择“置顶公众号”

技术文章第一时间送达!

作者:码上猿梦 cnblogs.com/daimajun/p/6545533.html

cnblogs.com/daimajun/p/6545533.html

阅**(点击即可跳转阅读)**

1. SpringBoot内容聚合

**2. **面试题内容聚合

**3. **设计模式内容聚合

**4. **排序算法内容聚合

**5. **多线程内容聚合

先讲一下java中的反射:

反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作。在比较复杂的程序或框架中来使用反射技术,可以简化代码提高程序的复用性。

讲的是Method类的invoke()方法。

对于反射中的invoke()方法的理解

既然是讲invoke方法,那就不讲怎么使用反射了,代码上来先:


package online;

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

import org.junit.Test;

public class Msym {

    public void test(String[] arg){
        for (String string : arg) {
            System.out.println(string);
        }
    }
    @Test
    public void demo1() throws Exception {
        //获取字节码对象
        ClassMsym clazz = (ClassMsym) Class.forName("online.Msym");
        //获取一个对象
        Constructor con =  clazz.getConstructor();
        Msym m = (Msym) con.newInstance();
        String[] s = new String[]{"aa","bb"};
        //获取Method对象
        Method method = clazz.getMethod("test", String[].class);
        //调用invoke方法来调用
        method.invoke(m, s);
    }
}

测试会报错:

对于反射中的invoke()方法的理解

红色框框显示是参数错误,test方法需要是字符串数组啊,我传递也是字符串数组,怎么就不对了??

让我们来看一下invoke方法:

对于反射中的invoke()方法的理解

invoke方法的参数,一个是Object类型,也就是调用该方法的对象,

第二个参数是一个可变参数类型,这个可变参数类型怎么能传递给一个数组类型呢?一个是多个参数。一个是一个数组参数,显然参数的个数不匹配,怎么解决呢?

解决办法就是将可变参数变成一个参数:

  • 将传递进去的s强转为Object类型
  • 将s重新包装成一个Object数组
  • 将s重新包装成一个Object数组

    测试一下:

    对于反射中的invoke()方法的理解

    结果可行。

    看到这里了,关注一个?

    对于反射中的invoke()方法的理解

    原文始发于微信公众号(后端技术精选):对于反射中的invoke()方法的理解

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 对于反射中的invoke()方法的理解


     上一篇
    深入理解 Java 内存模型 深入理解 Java 内存模型
    前提 《深入理解 Java 内存模型》程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。全书页数虽不多,内容讲得挺深的。细看的话,也是挺花时间的,看完收获绝对挺大的。也建议 Ja
    下一篇 
    Arrays.asList存在的坑 Arrays.asList存在的坑
    点击上方“后端技术精选”,选择“置顶公众号” 技术文章第一时间送达! 作者:我想问问天 juejin.im/post/5d10e52ee51d454f6f16ec11 juejin.im/post/5d1