Вызвано: java.lang.NoSuchFieldException: модификаторы
Я работаю над существующим старым кодом весенней загрузки при миграции/обновлении до весенней загрузки 2.7.16 и версии jdk, обновленной с 8 до 21. Я получаю эту ошибку
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.AbstractJdbcCall;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
public class CustomJDBCCall extends SimpleJdbcCall {
private final CustomCallMetaDataContext callMetaDataContext;
private static final String CALL_META_DATA_CONTEXT = "callMetaDataContext";
private static final String MODIFIERS = "modifiers";
private static final Logger LOGGER =Logger.getLogger(CustomJDBCCall.class);
public CustomJDBCCall(JdbcTemplate jdbcTemplate) throws Exception {
super(jdbcTemplate);
try {
callMetaDataContext = new CustomCallMetaDataContext();
// Access private field
Field callMetaDataContextField =
AbstractJdbcCall.class.getDeclaredField(CALL_META_DATA_CONTEXT);
callMetaDataContextField.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField(MODIFIERS);
modifiersField.setAccessible(true);
modifiersField.setInt(callMetaDataContextField,
callMetaDataContextField.getModifiers() & ~Modifier.FINAL);
callMetaDataContextField.set(this, this.callMetaDataContext);
} catch (NoSuchFieldException | IllegalAccessException ex) {
LOGGER.error("Error while using custom JDBC", ex);
throw new RuntimeException("Exception thrown overriding
AbstractJdbcCall.callMetaDataContext field", ex);
} catch (Exception ex) {
LOGGER.error("Error while using custom JDBC", ex);
throw ex;
}
}
public List<SqlParameter> getParamerters() throws Exception {
return this.callMetaDataContext.getCallParameters();
}
}
В этом коде исключение выдается в строке
Field modifiersField = Field.class.getDeclaredField(MODIFIERS);
Вызвано: java.lang.NoSuchFieldException: модификаторы в java.base/java.lang.Class.getDeclaredField(Class.java:2782)
Раньше в jdk 8 все работало нормально. Это существующий код, написанный не мной, и я думаю, что здесь можно получить доступ к частному конечному полю и установить значение. Я прав ? Я думаю, что в версии Jdk 12 и выше изменение конечной и частной переменной невозможно или отключено, есть ли какой-нибудь обходной путь?