diff --git a/hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java b/hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java index b80d23bf0..a4930a267 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java @@ -87,6 +87,12 @@ public final class FastBeanCopier { }; } + public static Object getProperty(Object source, String key) { + SingleValueMap map = new SingleValueMap<>(); + copy(source, map, include(key)); + return map.getValue(); + } + public static T copy(S source, T target, String... ignore) { return copy(source, target, DEFAULT_CONVERT, ignore); } @@ -571,7 +577,7 @@ public final class FastBeanCopier { return (T) collection; } - if (target.isEnumType()){ + if (target.isEnumType()) { if (target.isEnumDict()) { String strVal = String.valueOf(source); @@ -609,11 +615,11 @@ public final class FastBeanCopier { //快速复制map if (targetClass == Map.class) { - if(source instanceof Map) { + if (source instanceof Map) { return (T) new HashMap(((Map) source)); } ClassDescription sourType = ClassDescriptions.getDescription(source.getClass()); - return (T)copy(source, Maps.newHashMapWithExpectedSize(sourType.getFieldSize())); + return (T) copy(source, Maps.newHashMapWithExpectedSize(sourType.getFieldSize())); } return copy(source, beanFactory.newInstance(targetClass), this); diff --git a/hsweb-core/src/main/java/org/hswebframework/web/bean/SingleValueMap.java b/hsweb-core/src/main/java/org/hswebframework/web/bean/SingleValueMap.java new file mode 100644 index 000000000..08c024c61 --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/bean/SingleValueMap.java @@ -0,0 +1,108 @@ +package org.hswebframework.web.bean; + +import java.util.*; + +public class SingleValueMap implements Map { + private K key; + private V value; + + @Override + public int size() { + return value == null ? 0 : 1; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public boolean containsKey(Object key) { + return Objects.equals(this.key, key); + } + + @Override + public boolean containsValue(Object value) { + return Objects.equals(this.value, value); + } + + @Override + public V get(Object key) { + return null; + } + + @Override + public V put(K key, V value) { + this.key = key; + V old = this.value; + this.value = value; + return old; + } + + @Override + public V remove(Object key) { + if (Objects.equals(key, this.key)) { + V old = this.value; + this.value = null; + return old; + } + return null; + } + + @Override + public void putAll(Map m) { + if (m.size() > 0) { + Map.Entry entry = m.entrySet().iterator().next(); + this.key = entry.getKey(); + this.value = entry.getValue(); + } + } + + @Override + public void clear() { + this.key = null; + this.value = null; + } + + @Override + public Set keySet() { + return key == null ? Collections.emptySet() : Collections.singleton(key); + } + + @Override + public Collection values() { + return value == null ? Collections.emptySet() : Collections.singleton(value); + } + + @Override + public Set> entrySet() { + return key == null ? Collections.emptySet() : Collections.singleton( + new Entry() { + @Override + public K getKey() { + return key; + } + + @Override + public V getValue() { + return value; + } + + @Override + public V setValue(V value) { + V old = SingleValueMap.this.value; + SingleValueMap.this.value = value; + return old; + } + } + ); + } + + public V getValue() { + return value; + } + + public K getKey() { + return key; + } +}