From 906cbc057139a8ca7cdb46a495b9e439273de5f3 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Thu, 23 Jun 2016 20:20:08 +0800 Subject: [PATCH] --- src/org/redkale/convert/DeMember.java | 8 ++ src/org/redkale/convert/EnMember.java | 8 ++ src/org/redkale/util/Attribute.java | 154 +++++++++++++++++--------- 3 files changed, 117 insertions(+), 53 deletions(-) diff --git a/src/org/redkale/convert/DeMember.java b/src/org/redkale/convert/DeMember.java index 3f2c2b8e6..04d6e39c3 100644 --- a/src/org/redkale/convert/DeMember.java +++ b/src/org/redkale/convert/DeMember.java @@ -43,6 +43,14 @@ public final class DeMember implements Comparable DeMember create(final ConvertFactory factory, final Class clazz, final String fieldname, final Class fieldtype) { + return new DeMember<>(Attribute.create(clazz, fieldname, fieldtype), factory.loadDecoder(fieldtype)); + } + + public static DeMember create(final Attribute attribute, final ConvertFactory factory, final Class fieldtype) { + return new DeMember<>(attribute, factory.loadDecoder(fieldtype)); + } + public final boolean match(String name) { return attribute.field().equals(name); } diff --git a/src/org/redkale/convert/EnMember.java b/src/org/redkale/convert/EnMember.java index b8527944d..9f2ace3ad 100644 --- a/src/org/redkale/convert/EnMember.java +++ b/src/org/redkale/convert/EnMember.java @@ -48,6 +48,14 @@ public final class EnMember implements Comparable EnMember create(final ConvertFactory factory, final Class clazz, final String fieldname, final Class fieldtype) { + return new EnMember<>(Attribute.create(clazz, fieldname, fieldtype), factory.loadEncoder(fieldtype)); + } + + public static EnMember create(final Attribute attribute, final ConvertFactory factory, final Class fieldtype) { + return new EnMember<>(attribute, factory.loadEncoder(fieldtype)); + } + public final boolean match(String name) { return attribute.field().equals(name); } diff --git a/src/org/redkale/util/Attribute.java b/src/org/redkale/util/Attribute.java index 3aee088fd..0b9b3eff3 100644 --- a/src/org/redkale/util/Attribute.java +++ b/src/org/redkale/util/Attribute.java @@ -14,13 +14,13 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; * 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法; 代替低效的反射实现方式。 *
  *  public class Record {
- *
+ * 

* private String name; - * + *

* public String getName() { * return name; * } - * + *

* public void setName(String name) { * this.name = name; * } @@ -33,27 +33,27 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; * 等价于: *

  *  Attribute<Record, String> nameAction = new Attribute<Record, String>() {
- *
+ * 

* @Override * public String field() { * return "name"; * } - * + *

* @Override * public String get(Record obj) { * return obj.getName(); * } - * + *

* @Override * public void set(Record obj, String value) { * obj.setName(value); * } - * + *

* @Override * public Class type() { * return String.class; * } - * + *

* @Override * public Class declaringClass() { * return Record.class; @@ -66,7 +66,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; * 2、至少存在对应的getter、setter方法中的一个
* 当不存在getter方法时,get操作固定返回null
* 当不存在setter方法时,set操作为空方法
- * + *

*

* 详情见: http://redkale.org * @@ -101,6 +101,7 @@ public interface Attribute { * 获取指定对象的该字段的值 * * @param obj 指定对象 + * * @return 字段的值 */ public F get(T obj); @@ -108,7 +109,7 @@ public interface Attribute { /** * 给指定对象的该字段赋值 * - * @param obj 指定对象 + * @param obj 指定对象 * @param value 字段新值 */ public void set(T obj, F value); @@ -116,9 +117,10 @@ public interface Attribute { /** * 根据一个Field生成 Attribute 对象。 * - * @param 依附类的类型 - * @param 字段类型 + * @param 依附类的类型 + * @param 字段类型 * @param field 字段,如果该字段不存在则抛异常 + * * @return Attribute对象 */ @SuppressWarnings("unchecked") @@ -129,10 +131,11 @@ public interface Attribute { /** * 根据一个Field和field的别名生成 Attribute 对象。 * - * @param 依附类的类型 - * @param 字段类型 + * @param 依附类的类型 + * @param 字段类型 * @param fieldalias 别名 - * @param field 字段,如果该字段不存在则抛异常 + * @param field 字段,如果该字段不存在则抛异常 + * * @return Attribute对象 */ @SuppressWarnings("unchecked") @@ -143,10 +146,11 @@ public interface Attribute { /** * 根据一个Class和field真实名称生成 Attribute 对象。 * - * @param 依附类的类型 - * @param 字段类型 - * @param clazz 指定依附的类 + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 * @param fieldname 字段名,如果该字段不存在则抛异常 + * * @return Attribute对象 */ public static Attribute create(Class clazz, final String fieldname) { @@ -160,10 +164,11 @@ public interface Attribute { /** * 根据一个Class和Field生成 Attribute 对象。 * - * @param 依附类的类型 - * @param 字段类型 + * @param 依附类的类型 + * @param 字段类型 * @param clazz 指定依附的类 * @param field 字段,如果该字段不存在则抛异常 + * * @return Attribute对象 */ public static Attribute create(Class clazz, final java.lang.reflect.Field field) { @@ -173,11 +178,12 @@ public interface Attribute { /** * 根据一个Class、field别名和Field生成 Attribute 对象。 * - * @param 依附类的类型 - * @param 字段类型 - * @param clazz 指定依附的类 + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 * @param fieldalias 字段别名 - * @param field 字段,如果该字段不存在则抛异常 + * @param field 字段,如果该字段不存在则抛异常 + * * @return Attribute对象 */ public static Attribute create(Class clazz, final String fieldalias, final java.lang.reflect.Field field) { @@ -187,10 +193,11 @@ public interface Attribute { /** * 根据一个getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * - * @param 依附类的类型 - * @param 字段类型 + * @param 依附类的类型 + * @param 字段类型 * @param getter getter方法 * @param setter setter方法 + * * @return Attribute对象 */ @SuppressWarnings("unchecked") @@ -201,11 +208,12 @@ public interface Attribute { /** * 根据Class、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * - * @param 依附类的类型 - * @param 字段类型 - * @param clazz 指定依附的类 + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 * @param getter getter方法 * @param setter setter方法 + * * @return Attribute对象 */ public static Attribute create(Class clazz, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) { @@ -215,8 +223,9 @@ public interface Attribute { /** * 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。 * - * @param 依附类的类型 + * @param 依附类的类型 * @param clazz 指定依附的类 + * * @return Attribute对象数组 */ public static Attribute[] create(Class clazz) { @@ -247,8 +256,9 @@ public interface Attribute { /** * 根据Class生成getter方法对应的 Attribute 对象数组。 * - * @param 依附类的类型 + * @param 依附类的类型 * @param clazz 指定依附的类 + * * @return Attribute对象数组 */ public static Attribute[] createGetters(Class clazz) { @@ -271,8 +281,9 @@ public interface Attribute { /** * 根据Class生成setter方法对应的 Attribute 对象数组。 * - * @param 依附类的类型 + * @param 依附类的类型 * @param clazz 指定依附的类 + * * @return Attribute对象数组 */ public static Attribute[] createSetters(Class clazz) { @@ -295,12 +306,13 @@ public interface Attribute { /** * 根据Class、字段别名、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * - * @param 依附类的类型 - * @param 字段类型 - * @param clazz 指定依附的类 + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 * @param fieldalias 字段别名 - * @param getter getter方法 - * @param setter setter方法 + * @param getter getter方法 + * @param setter setter方法 + * * @return Attribute对象 */ public static Attribute create(Class clazz, final String fieldalias, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) { @@ -310,17 +322,51 @@ public interface Attribute { /** * 根据Class、字段别名、Field、getter和setter方法生成 Attribute 对象。 Field、tgetter、setter不能同时为null * - * @param 依附类的类型 - * @param 字段类型 - * @param clazz 指定依附的类 + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 * @param fieldalias 字段别名 - * @param field 字段 - * @param getter getter方法 - * @param setter setter方法 + * @param field 字段 + * @param getter getter方法 + * @param setter setter方法 + * + * @return Attribute对象 + */ + public static Attribute create(final Class clazz, String fieldalias, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter) { + return create(clazz, fieldalias, null, field, getter, setter); + } + + /** + * 根据Class、字段别名、字段类型生成虚构的 Attribute 对象,get、set方法为空方法。 + * + * @param + * @param + * @param clazz + * @param fieldalias + * @param fieldtype + * + * @return + */ + public static Attribute create(final Class clazz, String fieldalias, final Class fieldtype) { + return create(clazz, fieldalias, fieldtype, null, null, null); + } + + /** + * 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldalias&fieldtype、Field、tgetter、setter不能同时为null + * + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 + * @param fieldalias 字段别名 + * @param fieldtype 字段类型 + * @param field 字段 + * @param getter getter方法 + * @param setter setter方法 + * * @return Attribute对象 */ @SuppressWarnings("unchecked") - public static Attribute create(final Class clazz, String fieldalias, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter) { + public static Attribute create(final Class clazz, String fieldalias, final Class fieldtype, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter) { if (fieldalias != null && fieldalias.isEmpty()) fieldalias = null; int mod = field == null ? java.lang.reflect.Modifier.STATIC : field.getModifiers(); if (field != null && !java.lang.reflect.Modifier.isStatic(mod) && !java.lang.reflect.Modifier.isPublic(mod)) { @@ -349,29 +395,31 @@ public interface Attribute { if (field != null) { fieldalias = field.getName(); } else { - String s; + String s = null; if (getter != null) { s = getter.getName().substring(getter.getName().startsWith("is") ? 2 : 3); - } else { + } else if (setter != null) { s = setter.getName().substring(3); } - char[] d = s.toCharArray(); - if (d.length < 2 || Character.isLowerCase(d[1])) { - d[0] = Character.toLowerCase(d[0]); + if (s != null) { + char[] d = s.toCharArray(); + if (d.length < 2 || Character.isLowerCase(d[1])) { + d[0] = Character.toLowerCase(d[0]); + } + fieldalias = new String(d); } - fieldalias = new String(d); } } - if (tgetter == null && tsetter == null && tfield == null) { + if (fieldalias == null && fieldtype == null && tgetter == null && tsetter == null && tfield == null) { throw new RuntimeException("[" + clazz + "]have no public field or setter or getter"); } final String fieldname = fieldalias; - Class column; + Class column = fieldtype; if (tfield != null) { // public tfield column = tfield.getType(); } else if (tgetter != null) { column = tgetter.getReturnType(); - } else { // tsetter != null + } else if (tsetter != null) { column = tsetter.getParameterTypes()[0]; } final Class pcolumn = column;