This commit is contained in:
RedKale
2016-06-23 20:20:08 +08:00
parent 1f0c988f00
commit 906cbc0571
3 changed files with 117 additions and 53 deletions

View File

@@ -43,6 +43,14 @@ public final class DeMember<R extends Reader, T, F> implements Comparable<DeMemb
} }
} }
public static <R extends Reader, T, F> DeMember<R, T, F> create(final ConvertFactory factory, final Class<T> clazz, final String fieldname, final Class<F> fieldtype) {
return new DeMember<>(Attribute.create(clazz, fieldname, fieldtype), factory.loadDecoder(fieldtype));
}
public static <R extends Reader, T, F> DeMember<R, T, F> create(final Attribute<T, F> attribute, final ConvertFactory factory, final Class<F> fieldtype) {
return new DeMember<>(attribute, factory.loadDecoder(fieldtype));
}
public final boolean match(String name) { public final boolean match(String name) {
return attribute.field().equals(name); return attribute.field().equals(name);
} }

View File

@@ -48,6 +48,14 @@ public final class EnMember<W extends Writer, T, F> implements Comparable<EnMemb
} }
} }
public static <W extends Writer, T, F> EnMember<W, T, F> create(final ConvertFactory factory, final Class<T> clazz, final String fieldname, final Class<F> fieldtype) {
return new EnMember<>(Attribute.create(clazz, fieldname, fieldtype), factory.loadEncoder(fieldtype));
}
public static <W extends Writer, T, F> EnMember<W, T, F> create(final Attribute<T, F> attribute, final ConvertFactory factory, final Class<F> fieldtype) {
return new EnMember<>(attribute, factory.loadEncoder(fieldtype));
}
public final boolean match(String name) { public final boolean match(String name) {
return attribute.field().equals(name); return attribute.field().equals(name);
} }

View File

@@ -14,13 +14,13 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
* 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法 代替低效的反射实现方式。 * 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法 代替低效的反射实现方式。
* <blockquote><pre> * <blockquote><pre>
* public class Record { * public class Record {
* * <p>
* private String name; * private String name;
* * <p>
* public String getName() { * public String getName() {
* return name; * return name;
* } * }
* * <p>
* public void setName(String name) { * public void setName(String name) {
* this.name = name; * this.name = name;
* } * }
@@ -33,27 +33,27 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
* 等价于: * 等价于:
* <blockquote><pre> * <blockquote><pre>
* Attribute&lt;Record, String&gt; nameAction = new Attribute&lt;Record, String&gt;() { * Attribute&lt;Record, String&gt; nameAction = new Attribute&lt;Record, String&gt;() {
* * <p>
* &#64;Override * &#64;Override
* public String field() { * public String field() {
* return "name"; * return "name";
* } * }
* * <p>
* &#64;Override * &#64;Override
* public String get(Record obj) { * public String get(Record obj) {
* return obj.getName(); * return obj.getName();
* } * }
* * <p>
* &#64;Override * &#64;Override
* public void set(Record obj, String value) { * public void set(Record obj, String value) {
* obj.setName(value); * obj.setName(value);
* } * }
* * <p>
* &#64;Override * &#64;Override
* public Class type() { * public Class type() {
* return String.class; * return String.class;
* } * }
* * <p>
* &#64;Override * &#64;Override
* public Class declaringClass() { * public Class declaringClass() {
* return Record.class; * return Record.class;
@@ -66,7 +66,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
* 2、至少存在对应的getter、setter方法中的一个 <br> * 2、至少存在对应的getter、setter方法中的一个 <br>
* 当不存在getter方法时get操作固定返回null <br> * 当不存在getter方法时get操作固定返回null <br>
* 当不存在setter方法时set操作为空方法 <br> * 当不存在setter方法时set操作为空方法 <br>
* * <p>
* <p> * <p>
* 详情见: http://redkale.org * 详情见: http://redkale.org
* *
@@ -101,6 +101,7 @@ public interface Attribute<T, F> {
* 获取指定对象的该字段的值 * 获取指定对象的该字段的值
* *
* @param obj 指定对象 * @param obj 指定对象
*
* @return 字段的值 * @return 字段的值
*/ */
public F get(T obj); public F get(T obj);
@@ -108,7 +109,7 @@ public interface Attribute<T, F> {
/** /**
* 给指定对象的该字段赋值 * 给指定对象的该字段赋值
* *
* @param obj 指定对象 * @param obj 指定对象
* @param value 字段新值 * @param value 字段新值
*/ */
public void set(T obj, F value); public void set(T obj, F value);
@@ -116,9 +117,10 @@ public interface Attribute<T, F> {
/** /**
* 根据一个Field生成 Attribute 对象。 * 根据一个Field生成 Attribute 对象。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param field 字段,如果该字段不存在则抛异常 * @param field 字段,如果该字段不存在则抛异常
*
* @return Attribute对象 * @return Attribute对象
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -129,10 +131,11 @@ public interface Attribute<T, F> {
/** /**
* 根据一个Field和field的别名生成 Attribute 对象。 * 根据一个Field和field的别名生成 Attribute 对象。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param fieldalias 别名 * @param fieldalias 别名
* @param field 字段,如果该字段不存在则抛异常 * @param field 字段,如果该字段不存在则抛异常
*
* @return Attribute对象 * @return Attribute对象
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -143,10 +146,11 @@ public interface Attribute<T, F> {
/** /**
* 根据一个Class和field真实名称生成 Attribute 对象。 * 根据一个Class和field真实名称生成 Attribute 对象。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param fieldname 字段名,如果该字段不存在则抛异常 * @param fieldname 字段名,如果该字段不存在则抛异常
*
* @return Attribute对象 * @return Attribute对象
*/ */
public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldname) { public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldname) {
@@ -160,10 +164,11 @@ public interface Attribute<T, F> {
/** /**
* 根据一个Class和Field生成 Attribute 对象。 * 根据一个Class和Field生成 Attribute 对象。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param field 字段,如果该字段不存在则抛异常 * @param field 字段,如果该字段不存在则抛异常
*
* @return Attribute对象 * @return Attribute对象
*/ */
public static <T, F> Attribute<T, F> create(Class<T> clazz, final java.lang.reflect.Field field) { public static <T, F> Attribute<T, F> create(Class<T> clazz, final java.lang.reflect.Field field) {
@@ -173,11 +178,12 @@ public interface Attribute<T, F> {
/** /**
* 根据一个Class、field别名和Field生成 Attribute 对象。 * 根据一个Class、field别名和Field生成 Attribute 对象。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param fieldalias 字段别名 * @param fieldalias 字段别名
* @param field 字段,如果该字段不存在则抛异常 * @param field 字段,如果该字段不存在则抛异常
*
* @return Attribute对象 * @return Attribute对象
*/ */
public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldalias, final java.lang.reflect.Field field) { public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldalias, final java.lang.reflect.Field field) {
@@ -187,10 +193,11 @@ public interface Attribute<T, F> {
/** /**
* 根据一个getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * 根据一个getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param getter getter方法 * @param getter getter方法
* @param setter setter方法 * @param setter setter方法
*
* @return Attribute对象 * @return Attribute对象
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -201,11 +208,12 @@ public interface Attribute<T, F> {
/** /**
* 根据Class、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * 根据Class、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param getter getter方法 * @param getter getter方法
* @param setter setter方法 * @param setter setter方法
*
* @return Attribute对象 * @return Attribute对象
*/ */
public static <T, F> Attribute<T, F> create(Class<T> clazz, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) { public static <T, F> Attribute<T, F> create(Class<T> clazz, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) {
@@ -215,8 +223,9 @@ public interface Attribute<T, F> {
/** /**
* 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。 * 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
*
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] create(Class<T> clazz) { public static <T> Attribute<T, ?>[] create(Class<T> clazz) {
@@ -247,8 +256,9 @@ public interface Attribute<T, F> {
/** /**
* 根据Class生成getter方法对应的 Attribute 对象数组。 * 根据Class生成getter方法对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
*
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] createGetters(Class<T> clazz) { public static <T> Attribute<T, ?>[] createGetters(Class<T> clazz) {
@@ -271,8 +281,9 @@ public interface Attribute<T, F> {
/** /**
* 根据Class生成setter方法对应的 Attribute 对象数组。 * 根据Class生成setter方法对应的 Attribute 对象数组。
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
*
* @return Attribute对象数组 * @return Attribute对象数组
*/ */
public static <T> Attribute<T, ?>[] createSetters(Class<T> clazz) { public static <T> Attribute<T, ?>[] createSetters(Class<T> clazz) {
@@ -295,12 +306,13 @@ public interface Attribute<T, F> {
/** /**
* 根据Class、字段别名、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null * 根据Class、字段别名、getter和setter方法生成 Attribute 对象。 tgetter、setter不能同时为null
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param fieldalias 字段别名 * @param fieldalias 字段别名
* @param getter getter方法 * @param getter getter方法
* @param setter setter方法 * @param setter setter方法
*
* @return Attribute对象 * @return Attribute对象
*/ */
public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldalias, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) { public static <T, F> Attribute<T, F> create(Class<T> clazz, final String fieldalias, final java.lang.reflect.Method getter, final java.lang.reflect.Method setter) {
@@ -310,17 +322,51 @@ public interface Attribute<T, F> {
/** /**
* 根据Class、字段别名、Field、getter和setter方法生成 Attribute 对象。 Field、tgetter、setter不能同时为null * 根据Class、字段别名、Field、getter和setter方法生成 Attribute 对象。 Field、tgetter、setter不能同时为null
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型
* @param clazz 指定依附的类 * @param clazz 指定依附的类
* @param fieldalias 字段别名 * @param fieldalias 字段别名
* @param field 字段 * @param field 字段
* @param getter getter方法 * @param getter getter方法
* @param setter setter方法 * @param setter setter方法
*
* @return Attribute对象
*/
public static <T, F> Attribute<T, F> create(final Class<T> 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 <T>
* @param <F>
* @param clazz
* @param fieldalias
* @param fieldtype
*
* @return
*/
public static <T, F> Attribute<T, F> create(final Class<T> clazz, String fieldalias, final Class<F> fieldtype) {
return create(clazz, fieldalias, fieldtype, null, null, null);
}
/**
* 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldalias&fieldtype、Field、tgetter、setter不能同时为null
*
* @param <T> 依附类的类型
* @param <F> 字段类型
* @param clazz 指定依附的类
* @param fieldalias 字段别名
* @param fieldtype 字段类型
* @param field 字段
* @param getter getter方法
* @param setter setter方法
*
* @return Attribute对象 * @return Attribute对象
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T, F> Attribute<T, F> create(final Class<T> clazz, String fieldalias, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter) { public static <T, F> Attribute<T, F> create(final Class<T> clazz, String fieldalias, final Class<F> fieldtype, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter) {
if (fieldalias != null && fieldalias.isEmpty()) fieldalias = null; if (fieldalias != null && fieldalias.isEmpty()) fieldalias = null;
int mod = field == null ? java.lang.reflect.Modifier.STATIC : field.getModifiers(); 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)) { if (field != null && !java.lang.reflect.Modifier.isStatic(mod) && !java.lang.reflect.Modifier.isPublic(mod)) {
@@ -349,29 +395,31 @@ public interface Attribute<T, F> {
if (field != null) { if (field != null) {
fieldalias = field.getName(); fieldalias = field.getName();
} else { } else {
String s; String s = null;
if (getter != null) { if (getter != null) {
s = getter.getName().substring(getter.getName().startsWith("is") ? 2 : 3); s = getter.getName().substring(getter.getName().startsWith("is") ? 2 : 3);
} else { } else if (setter != null) {
s = setter.getName().substring(3); s = setter.getName().substring(3);
} }
char[] d = s.toCharArray(); if (s != null) {
if (d.length < 2 || Character.isLowerCase(d[1])) { char[] d = s.toCharArray();
d[0] = Character.toLowerCase(d[0]); 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"); throw new RuntimeException("[" + clazz + "]have no public field or setter or getter");
} }
final String fieldname = fieldalias; final String fieldname = fieldalias;
Class column; Class column = fieldtype;
if (tfield != null) { // public tfield if (tfield != null) { // public tfield
column = tfield.getType(); column = tfield.getType();
} else if (tgetter != null) { } else if (tgetter != null) {
column = tgetter.getReturnType(); column = tgetter.getReturnType();
} else { // tsetter != null } else if (tsetter != null) {
column = tsetter.getParameterTypes()[0]; column = tsetter.getParameterTypes()[0];
} }
final Class pcolumn = column; final Class pcolumn = column;