当前位置: 首页 > 知识库问答 >
问题:

java - Java 用反射动态给excel导出类修改注解报错?

谷隐水
2024-01-05

用的easyExcel 这个注解value是String[],这边方法传的也是String[] 出现了传参报错

java.lang.RuntimeException: java.lang.IllegalArgumentException: wrong number of arguments
@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ExcelProperty {    String[] value() default {""};    int index() default -1;    int order() default Integer.MAX_VALUE;    Class<? extends Converter<?>> converter() default AutoConverter.class;    /** @deprecated */    @Deprecated    String format() default "";}
ExcelProperty annotation = DogImport.class.getDeclaredField("field").getAnnotation(ExcelProperty.class);            String[] datas = new String[]{"new value"};            setAnnotationValue(annotation, "value", datas);
public static void setAnnotationValue(Object annotation, String propertyName, Object value) throws Exception {        Method valueMethod = annotation.getClass().getDeclaredMethod(propertyName);        valueMethod.setAccessible(true);        valueMethod.invoke(annotation,(Object) value);    }

共有1个答案

毛胜
2024-01-05

这个问题出现的原因是,setAnnotationValue方法中,你尝试将一个数组对象直接转换为Object类型,然后传递给valueMethod.invoke()。实际上,你应该传递数组的第一个元素,而不是整个数组。

修改后的setAnnotationValue方法如下:

public static void setAnnotationValue(Object annotation, String propertyName, Object value) throws Exception {    Method valueMethod = annotation.getClass().getDeclaredMethod(propertyName);    valueMethod.setAccessible(true);    // 如果是数组类型,只取第一个元素    if (value.getClass().isArray()) {        value = ((Object[]) value)[0];    }    valueMethod.invoke(annotation, value);}

这样,当value是数组类型时,valueMethod.invoke()会接收数组的第一个元素作为参数,从而避免了java.lang.IllegalArgumentException: wrong number of arguments这个错误。

 类似资料:
  • 如何动态修改实体类注解上的参数? 现在有个需求是EXCEL导入图片 这里用的是easypoi.excel 但是@Excel注解上的savePath是写死的,因为本地、测试、线上的路径都不一样,每次打包都要改 如何根据环境动态的去配置这个路径,所以我想在项目加载时动态去获取服务器的相对路径并设置

  • Java 导出 Excel 如何添加批注 想在一个excel文件中通过java代码添加批注(注意不是注释),有没有推荐的方案。需求是导出时批注不能丢失,要能与Excel兼容。

  • Java 导出Excel时如何添加注释? 我想在一个excel文件中添加注释,并且可以导出打开。有推荐的方案吗?

  • 本文向大家介绍Java 反射修改类的常量值、静态变量值、属性值实例详解,包括了Java 反射修改类的常量值、静态变量值、属性值实例详解的使用技巧和注意事项,需要的朋友参考一下 前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值。 定义一个实体类 利用反射修改私有静态常量方法 修改

  • 本文向大家介绍java 实现反射 json动态转实体类--fastjson,包括了java 实现反射 json动态转实体类--fastjson的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充:使用fastjson 进行jsonObject转实体类对象 首先引入相关jar包, 假设有一个实体类User 然后通过fastJson进行类型转换 以上为个人经验,希望

  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!