当前位置: 首页 > news >正文

【日常记录-Java】可变长度参数

1. 问题描述

        通过反射调用main方法,代码如下:

public class A {public static void main(String[] args){System.out.println("hello world!");}
}public class B {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class<?> clazz = Class.forName("A");Method method = clazz.getMethod("main", String[].class);method.invoke(null, args);}
}

        以B作为入口类,当参数个数不为1时,报错为“Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments”。参数个数为1时,报错为“Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch”。

2. 问题分析

2.1 基础知识

        在Java中,可变长度参数是一种允许方法接受任意数量参数(包括零个参数)的特性,该特性通过在参数类型后添加省略号(...)来声明。在方法内部,可变长度参数被视为一个数组,可以像处理数组一样处理该参数。相关要点如下:

  • 声明方式:在参数类型后添加省略号(...);
  • 位置要求:必须为方法参数列表的最后一个参数;
  • 处理方式:方法内部可被视为一个数组;
  • 调用方式:可以传递任意数量的参数,也可以传递一个数组作为参数。若传递一个数组,Java会自动将其视为可变长度参数;

2.2 分析

        invoke函数的签名为public Object invoke(Object obj, Object... args);其第2个参数为可变长度参数,而示例代码中第2个参数为字符串数组。由2.1中的可变参数调用方式可知,Java会自动将其视为可变长度参数进行拆解;当字符串数组长度为1时,其被解析为String类型,与main方法的String[]类型不匹配,当字符串数据长度不为1时,其参数个数与main方法参数个数不匹配,从而导致反射调用报错。

3. 解决方案

        为避免String[]被自动拆解,可在方法调用时进行类型转化。示例代码如下:

public class A {public static void main(String[] args){System.out.println("hello world!");}
}public class B {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class<?> clazz = Class.forName("A");Method method = clazz.getMethod("main", String[].class);method.invoke(null, (Object)args); // 类型转换为Object,避免自动拆解}
}


http://www.mrgr.cn/news/58499.html

相关文章:

  • 如何评估Mechanize和Poltergeist爬虫的效率和可靠性?
  • 【Docker】docker | 部署nginx
  • 算法通关--单调栈
  • 颐驰06持续交付,明日科技赋能出行生活
  • 域渗透相关内网 或 域AD环境搭建 域环境收集方式方法命令 查看 检测域控主机或者域内主机是否安装杀软方式
  • Unity Avatar详解
  • 写导出接口的一些理解
  • lazada 商品详情 API 的获取与应用
  • python调用PIL库处理图片
  • JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果
  • 【人工智能】——matplotlib教程
  • 广州企业管理咨询公司排名前十
  • 大尺寸反射式液晶显示模块行业分析:预计2030年全球市场规模将达到2,020.21百万美元
  • echarts给Y轴的不同轴线设置不同的颜色的样式
  • 【OpenAI】第二节(Token)关于ChatGPT的Token你了解多少?最全Token讲解过程!
  • SpringMVC8-HttpMessageConverter
  • 《企业自设2-软件测试》搭建locust环境+使用它搜索百度接口
  • 在Flutter中实现排行榜滑动阻尼效果
  • 大家都在用的HR招聘管理工具:国内Top5排名
  • 免费开源!语音识别平台让医疗对话更高效,沟通更准确
  • xtu oj 字母序列
  • 时间数据可视化基础实验(南丁格尔玫瑰图)——Python热狗大胃王比赛数据集
  • 网站建设中需要注意哪些安全问题?----雷池社区版
  • 达梦数据库基本操作指南:从表空间创建到触发器应用
  • K8S部署
  • 从设计到伴飞:数字孪生赋能航天航空新时代