问题主要有如下几点java
/** * 处理方法,将get方法转换为属性名 * * @param methodName * @return */ public static String dealMethodName(String methodName) { StringBuilder stringBuilder = new StringBuilder(); if (methodName.startsWith("get")) { stringBuilder.append(methodName.toLowerCase().charAt(3)).append(methodName.substring(4)); } else if (methodName.startsWith("is")) { stringBuilder.append(methodName.toLowerCase().charAt(2)).append(methodName.substring(3)); } else { return methodName; } return stringBuilder.toString(); }
问题2:因为能够获取到POJO对象的get方法,所以咱们可执行这个方法来进行获取到结果,从而也避免了private修饰的问题。面试
问题3:若是使用get方法获取过来的是一个对象,那么咱们能够经过判断是否是Object类来判断是否是须要迭代处理,后来发现,在使用一些基础数据类的时候,好比int,char,float等,他会自定的装箱,从而致使咱们没法处理,后来取了一个折中的办法自定义了一个注解,在返回值是POJO对象的地方标注,在使用反射获取get方法中获取这个注解,若是注解是null说明不是POJO,若是不是null,那么咱们进行二次的迭代处理该对象,注解代码以下:架构
//做用于方法上,运行时保留 @Target(value={METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface NeedIterative { //参数没有做用 String value() default ""; }
首先实现POJO类,POJO类主要代码以下所示<span style="color:red;">set方法已省略,自行补充,People类也是</span>,app
public class Student{ private String name; private int age; private float height; private double weight; private char sex; private boolean allow; private People people; public Student(String name, int age, float height, double weight, char sex, boolean allow) { this.name = name; this.age = age; this.height = height; this.weight = weight; this.sex = sex; this.allow = allow; } public String getName() { return name;} public int getAge() { return age; } public float getHeight() { return height;} public double getWeight() {return weight;} public char getSex() {return sex;} public boolean isAllow() { return allow;} //此处添加了注解,说明此处返回的是一个POJO须要迭代处理 @NeedIterative public People getPeople() { return new People("李亚伟",12); }
须要返回的对象POJO对象是People类的代码内容为框架
public class People{ private String people; private int work; public People(String people, int work) { this.people = people; this.work = work; } public String getPeople() { return people; } public int getWork() { return work; } }
代码很见到,都是Class等常见的API,这里不作赘述。分布式
public static Map toMap(Object obj) throws Exception { Class clazz = obj.getClass(); //得到属性 Field[] fields = obj.getClass().getDeclaredFields(); HashMap hashMap = new HashMap(fields.length); for (Field field : fields) { PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); //得到get方法 Method getMethod = pd.getReadMethod(); //执行get方法返回一个Object Object exeValue = getMethod.invoke(obj); String key = dealMethodName(getMethod.getName()); NeedIterative annotation = getMethod.getAnnotation(NeedIterative.class); //获取的注解不为空,那么说明此处返回的结果是对象,那么须要迭代处理 if (annotation != null) { exeValue = toMap(exeValue); } hashMap.put(key, exeValue); } return hashMap; }
因而可知,不论是基本数据类型,仍是POJO类都能正常的转换。源码分析
断点数据类型查看:性能
sout输出效果以下:学习
{ allow=true, sex=m, name=周涛, weight=12.23, people={ people=李亚伟, work=12 }, age=23, height=12.12 }
感兴趣能够加Java架构师群获取Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走不少的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验大数据
注:加群要求
一、具备工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。
二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。
三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。
四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知!