Ответ
Параметризация объектов в Runtime — это динамическое изменение их состояния или конфигурации после компиляции. Основные подходы:
1. Рефлексия (Java Reflection)
Позволяет инспектировать и модифицировать поля/методы класса.
public static void applyParams(Object target, Map<String, Object> params) throws Exception {
for (Map.Entry<String, Object> entry : params.entrySet()) {
Field field = target.getClass().getDeclaredField(entry.getKey());
field.setAccessible(true); // Нарушает инкапсуляцию!
field.set(target, entry.getValue());
}
}
// Использование:
MyConfig config = new MyConfig();
applyParams(config, Map.of("timeout", 100, "mode", "TEST"));
Недостатки:
- Нарушение инкапсуляции.
- Нет проверки типов на этапе компиляции.
- Низкая производительность.
2. Сериализация/десериализация (Jackson, Gson)
Идеально для конфигураций, задаваемых через JSON/YAML.
ObjectMapper mapper = new ObjectMapper();
String jsonParams = "{"host":"localhost", "port":8080}";
ServerConfig config = mapper.readValue(jsonParams, ServerConfig.class);
// Или обновление существующего объекта:
mapper.readerForUpdating(config).readValue(jsonParams);
3. Внедрение зависимостей (Spring, CDI)
Фреймворки управляют объектами и их свойствами через контекст.
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String host;
private int port;
// геттеры и сеттеры
}
// В application.properties: app.host=localhost, app.port=8080
Свойства могут переопределяться через переменные окружения или аргументы JVM.
4. Паттерн «Строитель» (Builder) с динамической конфигурацией
MyObject obj = MyObject.builder()
.applyDynamicConfig(paramsMap)
.build();
Рекомендации:
- Избегайте рефлексии там, где можно использовать сериализацию или DI.
- Для сложных правил преобразования типов используйте кастомные десериализаторы.
- Обеспечьте валидацию параметров (например, с помощью Bean Validation).