From 9ed7844c2e2859e9e931f5a26f6cdcf0e8de2d45 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Tue, 15 Mar 2016 11:43:36 +0800 Subject: [PATCH] --- src/main/java/org/redkale/util/Attribute.java | 86 ++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/redkale/util/Attribute.java b/src/main/java/org/redkale/util/Attribute.java index a47f89da9..49c252655 100644 --- a/src/main/java/org/redkale/util/Attribute.java +++ b/src/main/java/org/redkale/util/Attribute.java @@ -5,8 +5,10 @@ */ package org.redkale.util; -import static jdk.internal.org.objectweb.asm.Opcodes.*; +import java.util.ArrayList; +import java.util.List; import jdk.internal.org.objectweb.asm.*; +import static jdk.internal.org.objectweb.asm.Opcodes.*; /** * 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法; 代替低效的反射实现方式。 @@ -211,7 +213,87 @@ public interface Attribute { public static Attribute create(Class clazz, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) { return create(clazz, null, null, getter, setter); } - + + /** + * 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。 + * + * @param 依附类的类型 + * @param clazz 指定依附的类 + * @return Attribute对象数组 + */ + public static Attribute[] create(Class clazz) { + List> list = new ArrayList<>(); + for(java.lang.reflect.Field field : clazz.getFields()){ + if(java.lang.reflect.Modifier.isStatic(field.getModifiers())) continue; + if(java.lang.reflect.Modifier.isFinal(field.getModifiers())) continue; + list.add(create(clazz, field)); + } + for(java.lang.reflect.Method setter : clazz.getDeclaredMethods()){ + if(java.lang.reflect.Modifier.isStatic(setter.getModifiers())) continue; + if(!setter.getName().startsWith("set")) continue; + if(setter.getReturnType() != void.class) continue; + if(setter.getParameterCount() != 1) continue; + Class t = setter.getParameterTypes()[0]; + String prefix = t == boolean.class || t == Boolean.class ? "is" : "get"; + java.lang.reflect.Method getter = null; + try { + clazz.getMethod(setter.getName().replaceFirst("set", prefix)); + } catch (Exception e){ + continue; + } + list.add(create(clazz, getter, setter)); + } + return list.toArray(new Attribute[list.size()]); + } + + /** + * 根据Class生成getter方法对应的 Attribute 对象数组。 + * + * @param 依附类的类型 + * @param clazz 指定依附的类 + * @return Attribute对象数组 + */ + public static Attribute[] createGetters(Class clazz) { + List> list = new ArrayList<>(); + for(java.lang.reflect.Field field : clazz.getFields()){ + if(java.lang.reflect.Modifier.isStatic(field.getModifiers())) continue; + if(java.lang.reflect.Modifier.isFinal(field.getModifiers())) continue; + list.add(create(clazz, field)); + } + for(java.lang.reflect.Method method : clazz.getDeclaredMethods()){ + if(java.lang.reflect.Modifier.isStatic(method.getModifiers())) continue; + if(!method.getName().startsWith("get") && !method.getName().startsWith("is")) continue; + if(method.getReturnType() == void.class) continue; + if(method.getParameterCount() != 0) continue; + list.add(create(clazz, method, null)); + } + return list.toArray(new Attribute[list.size()]); + } + + /** + * 根据Class生成setter方法对应的 Attribute 对象数组。 + * + * @param 依附类的类型 + * @param clazz 指定依附的类 + * @return Attribute对象数组 + */ + public static Attribute[] createSetters(Class clazz) { + List> list = new ArrayList<>(); + for(java.lang.reflect.Field field : clazz.getFields()){ + if(java.lang.reflect.Modifier.isStatic(field.getModifiers())) continue; + if(java.lang.reflect.Modifier.isFinal(field.getModifiers())) continue; + list.add(create(clazz, field)); + } + for(java.lang.reflect.Method method : clazz.getDeclaredMethods()){ + if(java.lang.reflect.Modifier.isStatic(method.getModifiers())) continue; + if(!method.getName().startsWith("set")) continue; + if(method.getReturnType() != void.class) continue; + if(method.getParameterCount() != 1) continue; + list.add(create(clazz, null, method)); + } + return list.toArray(new Attribute[list.size()]); + } + /** * 根据Class、字段别名、getter和setter方法生成 Attribute 对象。 * tgetter、setter不能同时为null