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

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

java.lang.RuntimeException: java.lang.IllegalArgumentException: wrong number of arguments
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @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);
    }
阅读 641
avatarAI BotBETA

这个问题出现的原因是,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这个错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题