diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultConfig.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultConfig.java index 0d28ad012f4..f6cdd8afddf 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultConfig.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultConfig.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.Properties; import java.util.Set; +import java.util.HashMap; import java.util.concurrent.atomic.AtomicReference; import org.slf4j.Logger; @@ -101,7 +102,20 @@ public Set getPropertyNames() { return Collections.emptySet(); } - return properties.stringPropertyNames(); + return stringPropertyNames(properties); + } + + private Set stringPropertyNames(Properties properties) { + //jdk9以下版本Properties#enumerateStringProperties方法存在性能问题,keys() + get(k) 重复迭代, jdk9之后改为entrySet遍历. + Map h = new HashMap<>(); + for (Map.Entry e : properties.entrySet()) { + Object k = e.getKey(); + Object v = e.getValue(); + if (k instanceof String && v instanceof String) { + h.put((String) k, (String) v); + } + } + return h.keySet(); } @Override diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java index a82a04fc892..19b7ab75ca3 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java @@ -11,6 +11,8 @@ import java.util.Calendar; import java.util.Date; import java.util.Properties; +import java.util.Set; +import java.util.Collections; import java.util.concurrent.TimeUnit; import org.junit.After; @@ -645,6 +647,39 @@ public void onChange(ConfigChangeEvent changeEvent) { assertEquals(PropertyChangeType.ADDED, newKeyChange.getChangeType()); } + @Test + public void testGetPropertyNames() { + String someKeyPrefix = "someKey"; + String someValuePrefix = "someValue"; + + //set up config repo + someProperties = new Properties(); + for (int i = 0; i < 10; i++) { + someProperties.setProperty(someKeyPrefix + i, someValuePrefix + i); + } + + when(configRepository.getConfig()).thenReturn(someProperties); + + DefaultConfig defaultConfig = + new DefaultConfig(someNamespace, configRepository); + + Set propertyNames = defaultConfig.getPropertyNames(); + + assertEquals(10, propertyNames.size()); + assertEquals(someProperties.stringPropertyNames(), propertyNames); + } + + @Test + public void testGetPropertyNamesWithNullProp() { + when(configRepository.getConfig()).thenReturn(null); + + DefaultConfig defaultConfig = + new DefaultConfig(someNamespace, configRepository); + + Set propertyNames = defaultConfig.getPropertyNames(); + assertEquals(Collections.emptySet(), propertyNames); + } + private void checkDatePropertyWithFormat(Config config, Date expected, String propertyName, String format, Date defaultValue) { assertEquals(expected, config.getDateProperty(propertyName, format, defaultValue));