不要爲此做反射。取而代之的是,包裹function1
/function2
變成某種策略對象:
interface Strategy {
void doStuff();
}
class Function1 implements Strategy {
void doStuff() {
function1();
}
}
class Function2 implements Strategy {
void doStuff() {
function2();
}
}
然後,註冊所有的這些與一些工廠樣式類:最後
class StrategyFactory {
private Strategy defaultStrategy = new Function2();
Map<String, Strategy> strategies = ....
strategies.put("abc", new Function1());
...
Strategy getStrategy(String key) {
return strategies.getOrDefault(key, defaultStrategy);
}
}
,使用它:
factory.getStrategy(valueFromYaml).doStuff();
使key
更復雜的對象,而不僅僅是String
如果您需要適應吃更復雜的場景,或者使用比地圖查找更復雜的方式來選擇策略。
如果你不知道可用的策略運行時之前(例如,如果這些配置來自於一個數據庫或文件),只保留在地圖Strategy
實現的類名稱:
Map<String, String> strategyClassNames = ...;
strategy.put(keyFromDB, valueFromDB);
...
和使用它:
Class<? extends Strategy> strategy = Class.forName(strategyClassNames.get(key));
strategy.newInstance().doStuff();
你讀過關於使用yaml的外部配置的文檔嗎? https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-yaml –
我不認爲它關於YML,它也可以是屬性文件。所有我需要了解如果我從屬性文件中獲取外部字段,我可以在我的java方法中使用帽子設計,以便在屬性文件中添加更多外部變量的情況下具有最少的代碼更改。 –