Вызвано: 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 и выше изменение конечной и частной переменной невозможно или отключено, есть ли какой-нибудь обходной путь?

0 ответов

Другие вопросы по тегам