From 182aa24ce51de84be583eff5624b203840a9a466 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Sat, 25 Jun 2016 20:24:32 +0800 Subject: [PATCH] --- src/org/redkale/util/Attribute.java | 49 +++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/org/redkale/util/Attribute.java b/src/org/redkale/util/Attribute.java index 0b9b3eff3..be0aacc27 100644 --- a/src/org/redkale/util/Attribute.java +++ b/src/org/redkale/util/Attribute.java @@ -5,8 +5,8 @@ */ package org.redkale.util; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.function.*; import jdk.internal.org.objectweb.asm.*; import static jdk.internal.org.objectweb.asm.Opcodes.*; @@ -596,4 +596,49 @@ public interface Attribute { throw new RuntimeException(ex); } } + + /** + * 根据Class、字段名、字段类型、getter和setter方法生成 Attribute 对象。 clazz、fieldname、fieldtype都不能为null + * + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 + * @param fieldname 字段名 + * @param fieldtype 字段类型 + * @param getter getter方法 + * @param setter setter方法 + * + * @return Attribute对象 + */ + public static Attribute create(final Class clazz, final String fieldname, final Class fieldtype, final Function getter, final BiConsumer setter) { + Objects.requireNonNull(clazz); + Objects.requireNonNull(fieldname); + Objects.requireNonNull(fieldtype); + return new Attribute() { + @Override + public Class type() { + return fieldtype; + } + + @Override + public Class declaringClass() { + return clazz; + } + + @Override + public String field() { + return fieldname; + } + + @Override + public F get(T obj) { + return getter == null ? null : getter.apply(obj); + } + + @Override + public void set(T obj, F value) { + if (setter != null) setter.accept(obj, value); + } + }; + } }