Java如何动态修改实体类字段注解上的参数?

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

阅读 1.5k
avatarAI BotBETA

在Java中,注解(Annotation)是在编译时确定的,因此一旦编译完成,注解的内容(包括其参数)就固定下来了,运行时无法直接修改注解的内容。@Excel 注解属于此类情况,一旦源代码被编译成字节码(.class文件),注解的值就被固定了。

不过,您可以通过以下几种方法间接实现动态修改注解参数的效果:

  1. 配置文件或属性文件
    可以在项目中使用配置文件(如application.propertiesapplication.yml)或属性文件(如.properties文件)来存储不同环境的路径,然后在运行时根据当前环境加载相应的配置。

    例如,在application.properties中设置:

    excel.savePath.local=/path/to/local/images
    excel.savePath.test=/path/to/test/images
    excel.savePath.production=/path/to/production/images

    然后在代码中根据环境变量读取对应的路径:

    @Value("${excel.savePath.${environment}}")
    private String savePath;

    其中${environment}是一个占位符,表示当前环境(local, test, production)。

  2. 使用Spring的Environment对象
    如果您使用的是Spring框架,可以注入Environment对象来获取配置的属性值。

    @Autowired
    private Environment environment;
    
    public String getSavePath() {
        String envName = System.getProperty("spring.profiles.active"); // 获取当前激活的环境
        return environment.getProperty("excel.savePath." + envName);
    }
  3. 动态代理
    创建一个代理类,拦截对实体类的操作,并在代理中根据当前环境动态设置注解参数。这种方法比较复杂,一般不推荐,除非有特别的需求。
  4. 使用配置类
    创建一个配置类,通过配置类管理注解中需要动态修改的参数。
  5. 反射
    虽然Java的反射机制允许在运行时修改字段的值,但它不能直接修改注解的值。因此,反射不适用于此场景。

在您的具体情况下,由于@Excel注解属于EasyPoi库,该库可能没有提供直接的方式来动态修改注解参数。因此,您可能需要结合上述方法来达到动态配置savePath的效果。

例如,您可以创建一个配置类来管理不同环境的savePath,然后在EasyPoi的导入逻辑中,使用这个配置类中的savePath值来指定保存路径。这样,您就可以在不修改注解的情况下,实现动态配置图片保存路径的需求。

1 个回答
@Test
    public void test() {
        try {
            ImportParams params = new ImportParams();
            // 看这一行
            params.setSaveUrl(getSaveUrlOfEnv());
            params.setNeedSave(true);
            List<CompanyHasImgModel> result = ExcelImportUtil.importExcel(
                    new File(PoiPublicUtil.getWebRootPath("import/imgexcel.xls")),
                    CompanyHasImgModel.class, params);
            for (int i = 0; i < result.size(); i++) {
                System.out.println(ReflectionToStringBuilder.toString(result.get(i)));
            }
            Assert.assertTrue(result.size() == 4);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.设置保存路径saveUrl 默认为”upload/excelUpload”
可以手动修改 ImportParams 修改下就可以了

参考:http://doc.wupaas.com/docs/easypoi/easypoi-1c0u9afpc3kos

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