Spring Boot 原因:java.lang.NoSuchFieldException:修饰符

l7mqbcuq  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(148)

我正在使用现有的旧spring引导代码,同时迁移/升级到spring引导2.7.16和jdk版本从8升级到21我得到这个错误

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Modifier;
  3. import java.util.List;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.jdbc.core.SqlParameter;
  7. import org.springframework.jdbc.core.simple.AbstractJdbcCall;
  8. import org.springframework.jdbc.core.simple.SimpleJdbcCall;
  9. public class CustomJDBCCall extends SimpleJdbcCall {
  10. private final CustomCallMetaDataContext callMetaDataContext;
  11. private static final String CALL_META_DATA_CONTEXT = "callMetaDataContext";
  12. private static final String MODIFIERS = "modifiers";
  13. private static final Logger LOGGER =Logger.getLogger(CustomJDBCCall.class);
  14. public CustomJDBCCall(JdbcTemplate jdbcTemplate) throws Exception {
  15. super(jdbcTemplate);
  16. try {
  17. callMetaDataContext = new CustomCallMetaDataContext();
  18. // Access private field
  19. Field callMetaDataContextField =
  20. AbstractJdbcCall.class.getDeclaredField(CALL_META_DATA_CONTEXT);
  21. callMetaDataContextField.setAccessible(true);
  22. Field modifiersField = Field.class.getDeclaredField(MODIFIERS);
  23. modifiersField.setAccessible(true);
  24. modifiersField.setInt(callMetaDataContextField,
  25. callMetaDataContextField.getModifiers() & ~Modifier.FINAL);
  26. callMetaDataContextField.set(this, this.callMetaDataContext);
  27. } catch (NoSuchFieldException | IllegalAccessException ex) {
  28. LOGGER.error("Error while using custom JDBC", ex);
  29. throw new RuntimeException("Exception thrown overriding
  30. AbstractJdbcCall.callMetaDataContext field", ex);
  31. } catch (Exception ex) {
  32. LOGGER.error("Error while using custom JDBC", ex);
  33. throw ex;
  34. }
  35. }
  36. public List<SqlParameter> getParamerters() throws Exception {
  37. return this.callMetaDataContext.getCallParameters();
  38. }
  39. }

字符串
在这段代码中,

  1. Field modifiersField = Field.class.getDeclaredField(MODIFIERS);


原因:java.lang.NoSuchFieldException:modifiers at java.base/java.lang.Class.getDeclaredField(Class.java:2782)
之前它在jdk 8中工作正常。这是现有的代码不是我写的,我认为这里访问私有final字段并设置值。我对吗?我认为在Jdk版本12及以上修改final和私有变量是不可能的或禁用的,有没有任何工作?

dxpyg8gm

dxpyg8gm1#

在项目文件夹中添加了spring类AbstractJdbcCall.java,并使用确切的包名。然后添加以下方法以返回callMetaDataContext

  1. public CallMetaDataContext getCallMetaDataContext() {
  2. return this.callMetaDataContext;
  3. }

字符串
现在CustomJDBCCall看起来像这样

  1. public class CustomJDBCCall extends SimpleJdbcCall {
  2. public CustomJDBCCall(JdbcTemplate jdbcTemplate) throws Exception
  3. {
  4. super(jdbcTemplate);
  5. }
  6. public List<SqlParameter> getParamerters() throws Exception {
  7. return this.getCallMetaDataContext().getCallParameters();
  8. }
  9. }


这解决了我的问题。

展开查看全部

相关问题