diff --git a/UPDATE.md b/UPDATE.md index cbfbed6..12058d8 100644 --- a/UPDATE.md +++ b/UPDATE.md @@ -1,6 +1,12 @@ yexuejc-base 更新记录 ------------------ +#### version :1.3.1 +**time:2019-1-2 14:06:47**
+**branch:** master
+**update:**
+>1. objUtil 增加类字段(驼峰)转换成下划线 +# #### version :1.3.0 **time:2018-12-30 16:47:50**
**branch:** master
diff --git a/pom.xml b/pom.xml index 983db4a..a47dae6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ top.yexuejc yexuejc-base - 1.3.0 + 1.3.1 ${project.artifactId} https://github.com/yexuejc/yexuejc-base @@ -39,6 +39,7 @@ https://nexus.yexuejc.club/repository/ + https://nexus.mcworle.com/repository/ http://maven.aliyun.com/nexus/content/groups/public https://jitpack.io 0.7.0 @@ -148,19 +149,19 @@ - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - verify - - sign - - - - + + + + + + + + + + + + + @@ -183,16 +184,16 @@ - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - sonatype-nexus-staging - Nexus Release Repository - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - + + + + + + + + + + + + + releases + nexus-release + ${repos.mcworle.url}maven-releases/ + + + snapshots + nexus-snapshots + ${repos.mcworle.url}maven-snapshots/ + diff --git a/src/main/java/com/yexuejc/base/util/ObjUtil.java b/src/main/java/com/yexuejc/base/util/ObjUtil.java index 172568a..36fa98b 100644 --- a/src/main/java/com/yexuejc/base/util/ObjUtil.java +++ b/src/main/java/com/yexuejc/base/util/ObjUtil.java @@ -1,9 +1,8 @@ package com.yexuejc.base.util; -import com.fasterxml.jackson.databind.util.BeanUtil; -import com.sun.org.apache.xml.internal.serializer.OutputPropertyUtils; - import java.io.*; +import java.lang.reflect.Field; +import java.util.*; /** * 对象工具:对类的操作 @@ -18,6 +17,186 @@ public class ObjUtil { private ObjUtil() { } + /** + *

把对象按照{@link ToUeProperty}注解转换

+ * 字段值为空不输出 + * + * @param obj 要转换的对象 + * @return 转换后的值以Map返回 + */ + public static Map getToUeMap(Object obj) { + return getUnderlineMap(obj, true, false); + } + + /** + *

把对象按照注解转换

+ * 字段值为空不输出 + * + * @param obj 要转换的对象 + * @return 转换后的值toJson以String返回 + */ + public static String getToUeStr(Object obj) { + return JsonUtil.obj2Json(getUnderlineMap(obj, true, false)); + } + + /** + *

把对象驼峰字段转换成下划线输出,支持继承和字段类型为对象

+ * 字段值为空不输出 + * + * @param obj 要转换的对象 + * @return 转换后的值以Map返回 + */ + public static Map getUnderlineMap(Object obj) { + return getUnderlineMap(obj, true, false); + } + + /** + *

把对象驼峰字段转换成下划线输出,支持继承和字段类型为对象

+ * 字段值为空不输出 + * + * @param obj 要转换的对象 + * @return 转换后的值toJson以String返回 + */ + public static String getUnderlineStr(Object obj) { + return JsonUtil.obj2Json(getUnderlineMap(obj, true, false)); + } + + /** + * 把对象字段按{@link ToUeProperty}注解规则转换输出,支持继承和字段类型为对象 + * + * @param obj 要转换的对象 + * @param isAnnotationAll 是否全部依赖注解转换。全部依赖注解转换:true 只有字段上有注解的才转换,没有注解的默认不转换;false 有注解的依照注解转换,没有的全传下划线 + * @param putNull 是否映射null + * @return 转换后的值toJson以String返回 + */ + public static String getUnderlineStr(Object obj, boolean isAnnotationAll, boolean putNull) { + return JsonUtil.obj2Json(getUnderlineMap(obj, isAnnotationAll, putNull)); + } + + /** + * 把对象字段按{@link ToUeProperty}注解规则转换成输出,支持继承和字段类型为对象 + *

主要功能:解决输出时驼峰-下划线的转换

+ * + * @param obj 要转换的对象 + * @param isAnnotationAll 是否全部依赖注解转换。全部依赖注解转换:true 只有字段上有注解的才转换,没有注解的默认不转换;false 有注解的依照注解转换,没有的全传下划线 + * @param putNull 是否映射null + * @return + */ + public static Map getUnderlineMap(Object obj, boolean isAnnotationAll, boolean putNull) { + Class bindClass = obj.getClass(); + Map objMap = new HashMap<>(0); + /* + * 得到类中的所有属性集合 + */ + try { + List fieldList = new ArrayList<>(); + //当父类为null的时候说明到达了最上层的父类(Object类). + while (bindClass != null) { + fieldList.addAll(Arrays.asList(bindClass.getDeclaredFields())); + //得到父类,然后赋给自己 + bindClass = bindClass.getSuperclass(); + } + for (Field f : fieldList) { + //排除序列化 + if ("serialVersionUID".equals(f.getName())) { + continue; + } + //设置些属性是可以访问的 + f.setAccessible(true); + String fName = f.getName(); + if (!isAnnotationAll) { + fName = StrUtil.camelToUnderline(f.getName()); + } + boolean annotationPresent = f.isAnnotationPresent(ToUeProperty.class); + if (annotationPresent) { + ToUeProperty annotation = f.getAnnotation(ToUeProperty.class); + String value = annotation.value(); + if (StrUtil.isNotEmpty(value)) { + fName = value; + } + } + Object o = f.get(obj); + if (null == o || o.getClass().isPrimitive() || o instanceof String) { + if (null == o && !putNull) { + continue; + } + objMap.put(fName, f.get(obj)); + } else { + Map underlineMap = getUnderlineMap(o, isAnnotationAll, putNull); + objMap.put(fName, underlineMap); + } + } + } catch (IllegalAccessException e) { + System.out.println(e.getMessage()); + } + return objMap; + } + + + public static void main(String[] args) { + B a = new B(); + a.nameFirst = "张三"; + a.ageInt = "5165458"; + a.testAss = "asdasdsad"; + a.setaM1("method1"); + a.setbM1("b1Mthod1"); + a.protectedStr = "protectedStr"; + a.c = new C(); + a.c.ageInt = "test"; + Map underlineMap = getUnderlineMap(a, false, false); + System.out.println(JsonUtil.obj2Json(underlineMap)); + } + + static class A implements Serializable { + private static final long serialVersionUID = -8462118058721865488L; + public String nameFirst; + public String ageInt; + private String aM1; + @ToUeProperty("p_str") + protected String protectedStr; + + public String getaM1() { + return aM1; + } + + public A setaM1(String aM1) { + this.aM1 = aM1; + return this; + } + } + + static class B extends A { + private static final long serialVersionUID = -8462118058721865488L; + public String testAss; + private String bM1; + private C c; + + public String getbM1() { + return bM1; + } + + public B setbM1(String bM1) { + this.bM1 = bM1; + return this; + } + } + + static class C extends A { + private static final long serialVersionUID = -8462118058721865488L; + public String testAss; + private String bM1; + + public String getbM1() { + return bM1; + } + + public C setbM1(String bM1) { + this.bM1 = bM1; + return this; + } + } + + /** *

深度克隆对象

*

diff --git a/src/main/java/com/yexuejc/base/util/StrUtil.java b/src/main/java/com/yexuejc/base/util/StrUtil.java index 9664005..55c07c2 100644 --- a/src/main/java/com/yexuejc/base/util/StrUtil.java +++ b/src/main/java/com/yexuejc/base/util/StrUtil.java @@ -366,4 +366,57 @@ public final class StrUtil { } return msg; } + + /** + * 下划线字符 + */ + public static final char UNDERLINE = '_'; + + /** + * 字符串下划线转驼峰格式 + * + * @param param 需要转换的字符串 + * @return 转换好的字符串 + */ + public static String underlineToCamel(String param) { + if (isEmpty(param)) { + return ""; + } + String temp = param.toLowerCase(); + int len = temp.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = temp.charAt(i); + if (c == UNDERLINE) { + if (++i < len) { + sb.append(Character.toUpperCase(temp.charAt(i))); + } + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 字符串驼峰转下划线格式 + * + * @param param 需要转换的字符串 + * @return 转换好的字符串 + */ + public static String camelToUnderline(String param) { + if (isEmpty(param)) { + return ""; + } + int len = param.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = param.charAt(i); + if (Character.isUpperCase(c) && i > 0) { + sb.append(UNDERLINE); + } + sb.append(Character.toLowerCase(c)); + } + return sb.toString(); + } } diff --git a/src/main/java/com/yexuejc/base/util/ToUeProperty.java b/src/main/java/com/yexuejc/base/util/ToUeProperty.java new file mode 100644 index 0000000..4398c63 --- /dev/null +++ b/src/main/java/com/yexuejc/base/util/ToUeProperty.java @@ -0,0 +1,14 @@ +package com.yexuejc.base.util; + +import java.lang.annotation.*; + +@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ToUeProperty { + /** + * 字段名,默认该字段转下划线 + * @return + */ + String value() default ""; +} \ No newline at end of file