diff --git a/src/main/java/com/github/jsonzou/jmockdata/DataConfig.java b/src/main/java/com/github/jsonzou/jmockdata/DataConfig.java index 1ae084e56..e92e61a04 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/DataConfig.java +++ b/src/main/java/com/github/jsonzou/jmockdata/DataConfig.java @@ -1,5 +1,9 @@ package com.github.jsonzou.jmockdata; +import java.math.BigDecimal; + +import com.github.jsonzou.jmockdata.util.StringUtils; + /** * @Author: jsonzou * @Date: 2018/10/29 13:24 @@ -30,8 +34,24 @@ public class DataConfig { private String numberRegex = null; private String stringRegex = null; + + // 直接设置的值!!! + private String val; + + public DataConfig setVal(String val) { + this.val = val; + return this; + } + + public String getVal() { + return val; + } + + public BigDecimal getValNum() { + return StringUtils.isEmpty(this.val) ? null : new BigDecimal(this.val); + } - public DataConfig(MockConfig config) { + public DataConfig(MockConfig config) { this.config = config; } @@ -42,6 +62,10 @@ public DataConfig(MockConfig config) { public MockConfig globalConfig(){ return this.config; } + + public Mocker getMocker(Class clazz) { + return globalConfig().getMocker(clazz); + } /** * 配置转路器 - 切换设置全局字段模拟配置 diff --git a/src/main/java/com/github/jsonzou/jmockdata/GlobalBeanMockerInterceptor.java b/src/main/java/com/github/jsonzou/jmockdata/GlobalBeanMockerInterceptor.java new file mode 100644 index 000000000..34491bc27 --- /dev/null +++ b/src/main/java/com/github/jsonzou/jmockdata/GlobalBeanMockerInterceptor.java @@ -0,0 +1,61 @@ + +/** + * Project Name: jmockdata + * File Name: GlobalBeanMockerInterceptor.java + * @date 2022年1月17日 下午7:37:48 + * Copyright (c) 2022 jpq.com All Rights Reserved. + */ + +package com.github.jsonzou.jmockdata; + +import java.lang.reflect.Field; +import java.math.BigDecimal; + +import com.github.jsonzou.jmockdata.annotation.MockValue; +import com.github.jsonzou.jmockdata.mocker.BaseMocker; +import com.github.jsonzou.jmockdata.util.ReflectionUtils; +import com.github.jsonzou.jmockdata.util.StringUtils; + +/** + * TODO
+ * @date 2022年1月17日 下午7:37:48 + * @author jpq + * @version + */ +public class GlobalBeanMockerInterceptor implements BeanMockerInterceptor { + @Override + public Object mock(Class clazz, Field field, T bean, DataConfig dataConfig) throws IllegalAccessException { + MockValue mockValue = field.getAnnotation(MockValue.class); + if(null != mockValue) { + boolean isCharSeq = ReflectionUtils.isCharSeq(field.getType()); + if(StringUtils.isNotEmpty(mockValue.value())) { + if(isCharSeq) { + field.set(bean, mockValue.value()); + } else { + field.set(bean, dataConfig.setVal(mockValue.value()).getMocker(field.getType()).mock(dataConfig)); + dataConfig.setVal(null); + } + return InterceptType.UNMOCK; + } + if(StringUtils.isNotEmpty(mockValue.regex())) { + dataConfig.subConfig(clazz, field.getName()); + Runnable func = null; + if(isCharSeq) { + dataConfig.stringRegex(mockValue.regex()); + func = () -> dataConfig.stringRegex(null); + } else { + dataConfig.numberRegex(mockValue.regex()); + func = () -> dataConfig.numberRegex(null); + } + field.set(bean, new BaseMocker<>(field.getGenericType()).mock(dataConfig)); + func.run(); + return InterceptType.UNMOCK; + } +// if(!StringUtils.isAnyBlank(mockValue.rangeMin(), mockValue.rangeMax())) { +// dataConfig.subConfig(clazz, field.getName()).dateRange(mockValue.rangeMin(), mockValue.rangeMax()); +// return InterceptType.MOCK; +// } + } + return InterceptType.MOCK; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/jsonzou/jmockdata/JMockData.java b/src/main/java/com/github/jsonzou/jmockdata/JMockData.java index f33445235..890e1878e 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/JMockData.java +++ b/src/main/java/com/github/jsonzou/jmockdata/JMockData.java @@ -1,5 +1,7 @@ package com.github.jsonzou.jmockdata; +import java.lang.reflect.Type; + import com.github.jsonzou.jmockdata.mocker.BaseMocker; /** @@ -62,4 +64,20 @@ public static T mock(TypeReference typeReference, MockConfig mockConfig) return new BaseMocker(typeReference.getType()).mock(config); } + + public static T mock(Type type) { + return mock(type, new MockConfig()); + } + + public static T mock(Type type, MockConfig mockConfig) { + mockConfig.init(type); + DataConfig config=mockConfig.globalDataConfig(); + return new BaseMocker(type).mock(config); + } + + public static T mock(Type type, DataConfig dataConfig) { + MockConfig mockConfig = dataConfig.globalConfig(); + mockConfig.init(type); + return new BaseMocker(type).mock(dataConfig); + } } diff --git a/src/main/java/com/github/jsonzou/jmockdata/MockConfig.java b/src/main/java/com/github/jsonzou/jmockdata/MockConfig.java index 7f66c426a..95e8df59a 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/MockConfig.java +++ b/src/main/java/com/github/jsonzou/jmockdata/MockConfig.java @@ -4,6 +4,7 @@ import com.github.jsonzou.jmockdata.annotation.MockIgnore; import com.github.jsonzou.jmockdata.mocker.*; import com.github.jsonzou.jmockdata.util.FieldMatchingResolver; +import com.github.jsonzou.jmockdata.util.ReflectionUtils; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -11,6 +12,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -37,6 +39,7 @@ public class MockConfig { private static final LocalDateMocker LOCAL_DATE_MOCKER = new LocalDateMocker(); private static final LocalTimeMocker LOCAL_TIME_MOCKER = new LocalTimeMocker(); private static final TimestampMocker TIMESTAMP_MOCKER = new TimestampMocker(); + private static final InstantMocker INSTANT_MOCKER = new InstantMocker(); private boolean enabledCircle = false; private boolean enabledStatic = false; private boolean enabledPublic = true; @@ -96,6 +99,8 @@ public MockConfig() { registerMocker(LOCAL_DATE_MOCKER, LocalDate.class); registerMocker(LOCAL_TIME_MOCKER, LocalTime.class); registerMocker(TIMESTAMP_MOCKER, Timestamp.class); + registerMocker(INSTANT_MOCKER, Instant.class); + registerBeanMockerInterceptor(new GlobalBeanMockerInterceptor<>()); } /** @@ -123,16 +128,28 @@ public Enum[] getcacheEnum(String enumClassName) { } public MockConfig init(Type type) { - if (type instanceof ParameterizedType) { - Class clazz = (Class) ((ParameterizedType) type).getRawType(); - Type[] types = ((ParameterizedType) type).getActualTypeArguments(); - TypeVariable[] typeVariables = clazz.getTypeParameters(); - if (typeVariables != null && typeVariables.length > 0) { - for (int index = 0; index < typeVariables.length; index++) { - typeVariableCache.put(typeVariables[index].getName(), types[index]); + if (null == type || !(type instanceof ParameterizedType)) { + return this; + } + ParameterizedType paramType = (ParameterizedType) type; // 原始类型Rest>> + Class clazz = (Class) paramType.getRawType(); // Rest + Type[] types = paramType.getActualTypeArguments(); // PageVo> + + Class supperClazz = clazz; + while (supperClazz != null && !ReflectionUtils.isSystemClass(clazz.getName())) { + TypeVariable[] typeVariables = supperClazz.getTypeParameters(); // Rest的泛型 T + if(typeVariables == null || typeVariables.length == 0) { + break; } - } + for (int index = 0; index < typeVariables.length; index++) { // Rest.T : PageVo> + typeVariableCache.put(ReflectionUtils.getTypeVariableName(typeVariables[index]), types[index]); + if (supperClazz == clazz) { + init(types[index]); + } + } + supperClazz = supperClazz.getSuperclass(); } + return this; } diff --git a/src/main/java/com/github/jsonzou/jmockdata/Mocker.java b/src/main/java/com/github/jsonzou/jmockdata/Mocker.java index 328e2193b..9497ffc1f 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/Mocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/Mocker.java @@ -3,6 +3,7 @@ /** * 模拟器接口 */ +@FunctionalInterface public interface Mocker { /** diff --git a/src/main/java/com/github/jsonzou/jmockdata/annotation/MockValue.java b/src/main/java/com/github/jsonzou/jmockdata/annotation/MockValue.java new file mode 100644 index 000000000..060d0a0dd --- /dev/null +++ b/src/main/java/com/github/jsonzou/jmockdata/annotation/MockValue.java @@ -0,0 +1,37 @@ + +/** + * Project Name: fast-flowable-api + * File Name: MockValue.java + * @date 2022年1月17日 下午1:24:48 + * Copyright (c) 2022 jpq.com All Rights Reserved. + */ + +package com.github.jsonzou.jmockdata.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @MockIgnore 优先级更高
+ * @date 2022年1月17日 下午1:24:48 + * @author jpq + * @version + */ +@Target({ ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface MockValue { + + // 默认值,优先级最高;对于布尔值,true/false + String value() default ""; + + // 正则格式,只支持字符串、数字!!! + String regex() default ""; +} + + \ No newline at end of file diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/ArrayMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/ArrayMocker.java index 6a3c5d0ca..66de5396b 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/ArrayMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/ArrayMocker.java @@ -4,6 +4,8 @@ import com.github.jsonzou.jmockdata.MockConfig; import com.github.jsonzou.jmockdata.Mocker; import com.github.jsonzou.jmockdata.util.RandomUtils; +import com.github.jsonzou.jmockdata.util.ReflectionUtils; + import java.lang.reflect.Array; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; @@ -95,7 +97,7 @@ private Map> map(DataConfig mockConfig, GenericArray } if (componentType instanceof TypeVariable) { Map map = new HashMap<>(); - map.put((Class) mockConfig.globalConfig().getVariableType(((TypeVariable) componentType).getName()), null); + map.put((Class) mockConfig.globalConfig().getVariableType(ReflectionUtils.getTypeVariableName((TypeVariable) componentType)), null); result.put(dimension, map); return result; } diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/BaseMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/BaseMocker.java index a1a7bd72a..55f5e738e 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/BaseMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/BaseMocker.java @@ -2,6 +2,7 @@ import com.github.jsonzou.jmockdata.DataConfig; import com.github.jsonzou.jmockdata.Mocker; +import com.github.jsonzou.jmockdata.util.ReflectionUtils; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; @@ -28,7 +29,7 @@ public T mock(DataConfig mockConfig) { } else if (type instanceof GenericArrayType) { mocker = new ArrayMocker(type); } else if (type instanceof TypeVariable) { - mocker = new BaseMocker(mockConfig.globalConfig().getVariableType(((TypeVariable) type).getName())); + mocker = new BaseMocker(mockConfig.globalConfig().getVariableType(ReflectionUtils.getTypeVariableName((TypeVariable) type))); } else { mocker = new ClassMocker((Class) type, genericTypes); } diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/BeanMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/BeanMocker.java index e2c9a3613..6be7ab5dc 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/BeanMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/BeanMocker.java @@ -5,9 +5,12 @@ import com.github.jsonzou.jmockdata.util.ReflectionUtils; import java.beans.IntrospectionException; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -33,7 +36,36 @@ public Object mock(DataConfig mockConfig) { return cacheBean; } } - Object result = clazz.newInstance(); + Object result = null; + try { + result = clazz.newInstance(); + }catch (Exception e) { + // 某些类没有构造方法,clazz.getDeclaredConstructor(); 也会报错 + Constructor[] constructors = clazz.getDeclaredConstructors(); + int idx = 0; + int len = 1; + for(int i=0; i declaredConstructor = clazz.getDeclaredConstructors()[idx]; + Object[] params = new Object[len]; + Type type = null; + for(int i=0; i) type)); + } + params[i] = JMockData.mock(type, mockConfig); + } +// Object param = JMockData.mock(declaredConstructor.getGenericParameterTypes()[0], mockConfig); + result = declaredConstructor.newInstance(params); + } mockConfig.globalConfig().cacheBean(clazz.getName(), result); /** * 是否配置排除整个类 diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/BigDecimalMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/BigDecimalMocker.java index 68a90b6c4..b54acd184 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/BigDecimalMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/BigDecimalMocker.java @@ -4,6 +4,8 @@ import com.github.jsonzou.jmockdata.MockConfig; import com.github.jsonzou.jmockdata.Mocker; import com.github.jsonzou.jmockdata.util.RandomUtils; +import com.github.jsonzou.jmockdata.util.StringUtils; + import java.math.BigDecimal; import java.math.BigInteger; @@ -14,6 +16,9 @@ public class BigDecimalMocker implements Mocker { @Override public BigDecimal mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum(); + } return BigDecimal.valueOf(mockConfig.globalConfig().getMocker(Double.class).mock(mockConfig)); } diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/BigIntegerMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/BigIntegerMocker.java index 3d4d32820..894484a52 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/BigIntegerMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/BigIntegerMocker.java @@ -4,6 +4,7 @@ import com.github.jsonzou.jmockdata.MockConfig; import com.github.jsonzou.jmockdata.Mocker; import com.github.jsonzou.jmockdata.util.RandomUtils; +import com.github.jsonzou.jmockdata.util.StringUtils; import java.math.BigDecimal; import java.math.BigInteger; @@ -14,6 +15,9 @@ public class BigIntegerMocker implements Mocker { @Override public BigInteger mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().toBigInteger(); + } return BigInteger.valueOf(mockConfig.globalConfig().getMocker(Long.class).mock(mockConfig)); } diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/BooleanMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/BooleanMocker.java index a6d1c5ecc..03c27cdd8 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/BooleanMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/BooleanMocker.java @@ -4,6 +4,7 @@ import com.github.jsonzou.jmockdata.MockConfig; import com.github.jsonzou.jmockdata.Mocker; import com.github.jsonzou.jmockdata.util.RandomUtils; +import com.github.jsonzou.jmockdata.util.StringUtils; /** * Boolean对象模拟器 @@ -12,6 +13,9 @@ public class BooleanMocker implements Mocker { @Override public Boolean mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return "true".equals(mockConfig.getVal().toLowerCase()); + } boolean[] booleanSeed = mockConfig.booleanSeed(); return booleanSeed[RandomUtils.nextInt(0, booleanSeed.length)]; } diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/ByteMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/ByteMocker.java index 9f236994c..78785d767 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/ByteMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/ByteMocker.java @@ -12,6 +12,9 @@ public class ByteMocker implements Mocker { @Override public Byte mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().byteValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/ClassMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/ClassMocker.java index 2ec273b2b..b6ed3de58 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/ClassMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/ClassMocker.java @@ -24,7 +24,9 @@ public Object mock(DataConfig mockConfig) { if (clazz.isArray()) { mocker = new ArrayMocker(clazz); } else if (Map.class.isAssignableFrom(clazz)) { - mocker = new MapMocker(genericTypes); + mocker = mockConfig.globalConfig().getMocker(clazz); + // MapMocker 默认是HashMap,但是很多包自带的Map,所以先从上面获取,因为可以注入 registerMocker + mocker = null == mocker ? new MapMocker(genericTypes) : mocker; } else if (Collection.class.isAssignableFrom(clazz)) { mocker = new CollectionMocker(clazz, genericTypes[0]); } else if (clazz.isEnum()) { diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/DoubleMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/DoubleMocker.java index 63dbd3d44..bf921584a 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/DoubleMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/DoubleMocker.java @@ -14,6 +14,9 @@ public class DoubleMocker implements Mocker { @Override public Double mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().doubleValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/FloatMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/FloatMocker.java index f9415fffa..880136e6d 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/FloatMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/FloatMocker.java @@ -14,6 +14,9 @@ public class FloatMocker implements Mocker { @Override public Float mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().floatValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/InstantMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/InstantMocker.java new file mode 100644 index 000000000..e1f280c7e --- /dev/null +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/InstantMocker.java @@ -0,0 +1,19 @@ +package com.github.jsonzou.jmockdata.mocker; + +import com.github.jsonzou.jmockdata.DataConfig; +import com.github.jsonzou.jmockdata.Mocker; + +import java.time.Instant; +import java.util.Date; + +/** + * Instant对象模拟器 + */ +public class InstantMocker implements Mocker { + private DateMocker dateMocker = new DateMocker(); + @Override + public Instant mock(DataConfig mockConfig) { + Date date = dateMocker.mock(mockConfig); + return date.toInstant(); + } +} diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/IntegerMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/IntegerMocker.java index 1f5f7b058..139b698cc 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/IntegerMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/IntegerMocker.java @@ -12,6 +12,9 @@ public class IntegerMocker implements Mocker { @Override public Integer mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().intValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/LongMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/LongMocker.java index 67877bd1c..4ea19c136 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/LongMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/LongMocker.java @@ -12,6 +12,9 @@ public class LongMocker implements Mocker { @Override public Long mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().longValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/ShortMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/ShortMocker.java index 591d6f295..19ebe1ea5 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/ShortMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/ShortMocker.java @@ -12,6 +12,9 @@ public class ShortMocker implements Mocker { @Override public Short mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getValNum().shortValue(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/mocker/StringMocker.java b/src/main/java/com/github/jsonzou/jmockdata/mocker/StringMocker.java index 0ab36f28b..ffeea9a50 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/mocker/StringMocker.java +++ b/src/main/java/com/github/jsonzou/jmockdata/mocker/StringMocker.java @@ -12,6 +12,9 @@ public class StringMocker implements Mocker { @Override public String mock(DataConfig mockConfig) { + if(StringUtils.isNotEmpty(mockConfig.getVal())) { + return mockConfig.getVal(); + } /** * 若根据正则模拟 */ diff --git a/src/main/java/com/github/jsonzou/jmockdata/util/ReflectionUtils.java b/src/main/java/com/github/jsonzou/jmockdata/util/ReflectionUtils.java index cdb6fd9ee..108caa6c7 100644 --- a/src/main/java/com/github/jsonzou/jmockdata/util/ReflectionUtils.java +++ b/src/main/java/com/github/jsonzou/jmockdata/util/ReflectionUtils.java @@ -5,10 +5,14 @@ import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.lang.reflect.GenericDeclaration; import java.lang.reflect.Method; +import java.lang.reflect.TypeVariable; import java.util.LinkedHashMap; import java.util.Map; +import com.github.jsonzou.jmockdata.MockException; + /** * 反射工具类 */ @@ -63,4 +67,26 @@ public static Map fieldAndSetterMethod(Class clazz) throws Intros return map; } + public static boolean isSystemClass(String name) { + return name.startsWith("java.") || name.startsWith("javax."); + } + + /** + * 将泛型的名称唯一化
+ * @author jpq + * @param typeVariable + * @return + */ + public static String getTypeVariableName(TypeVariable typeVariable) { + GenericDeclaration declaration = typeVariable.getGenericDeclaration(); + if (!(declaration instanceof Class)) { + throw new MockException("unknown error"); + } + + return String.format("%s.%s", ((Class) declaration).getName(), typeVariable.getName()); + } + + public static boolean isCharSeq(Class clazz) { + return CharSequence.class.isAssignableFrom(clazz); + } }