diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java
index 6a7104dd9..5e88a6804 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java
@@ -16,8 +16,9 @@
package org.dromara.hutool.core.bean;
+import org.dromara.hutool.core.reflect.Invoker;
+
import java.io.Serializable;
-import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
@@ -62,7 +63,7 @@ public interface BeanDesc extends Serializable {
* @param fieldName 字段名
* @return Getter方法
*/
- default Method getGetter(final String fieldName) {
+ default Invoker getGetter(final String fieldName) {
final PropDesc desc = getProp(fieldName);
return null == desc ? null : desc.getGetter();
}
@@ -73,7 +74,7 @@ public interface BeanDesc extends Serializable {
* @param fieldName 字段名
* @return Setter方法
*/
- default Method getSetter(final String fieldName) {
+ default Invoker getSetter(final String fieldName) {
final PropDesc desc = getProp(fieldName);
return null == desc ? null : desc.getSetter();
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java
index 4a8a90de5..8cb40558c 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java
@@ -20,7 +20,7 @@ import org.dromara.hutool.core.annotation.AnnotationUtil;
import org.dromara.hutool.core.annotation.PropIgnore;
import org.dromara.hutool.core.convert.ConvertUtil;
import org.dromara.hutool.core.reflect.*;
-import org.dromara.hutool.core.reflect.method.MethodUtil;
+import org.dromara.hutool.core.reflect.method.MethodInvoker;
import java.beans.Transient;
import java.lang.reflect.Field;
@@ -37,7 +37,7 @@ public class PropDesc {
/**
* 字段
*/
- private Field field;
+ private Invoker fieldInvoker;
/**
* 字段名
*/
@@ -45,11 +45,11 @@ public class PropDesc {
/**
* Getter方法
*/
- protected Method getter;
+ protected Invoker getter;
/**
* Setter方法
*/
- protected Method setter;
+ protected Invoker setter;
/**
* 构造
@@ -61,21 +61,21 @@ public class PropDesc {
*/
public PropDesc(final Field field, final Method getter, final Method setter) {
this(FieldUtil.getFieldName(field), getter, setter);
- this.field = field;
+ this.fieldInvoker = null == field ? null : FieldInvoker.of(field);
}
/**
* 构造
* Getter和Setter方法设置为默认可访问
*
- * @param fieldName 字段名
- * @param getter get方法
- * @param setter set方法
+ * @param fieldName 字段名
+ * @param getterMethod get方法
+ * @param setterMethod set方法
*/
- public PropDesc(final String fieldName, final Method getter, final Method setter) {
+ public PropDesc(final String fieldName, final Method getterMethod, final Method setterMethod) {
this.fieldName = fieldName;
- this.getter = ReflectUtil.setAccessible(getter);
- this.setter = ReflectUtil.setAccessible(setter);
+ this.getter = null == getterMethod ? null : MethodInvoker.of(getterMethod);
+ this.setter = null == setterMethod ? null : MethodInvoker.of(setterMethod);
}
/**
@@ -94,7 +94,11 @@ public class PropDesc {
* @since 5.1.6
*/
public String getRawFieldName() {
- return null == this.field ? null : this.field.getName();
+ if (null == this.fieldInvoker) {
+ return this.fieldName;
+ }
+
+ return this.fieldInvoker.getName();
}
/**
@@ -103,7 +107,10 @@ public class PropDesc {
* @return 字段
*/
public Field getField() {
- return this.field;
+ if (null != this.fieldInvoker && this.fieldInvoker instanceof FieldInvoker) {
+ return ((FieldInvoker) this.fieldInvoker).getField();
+ }
+ return null;
}
/**
@@ -113,8 +120,8 @@ public class PropDesc {
* @return 字段类型
*/
public Type getFieldType() {
- if (null != this.field) {
- return TypeUtil.getType(this.field);
+ if (null != this.fieldInvoker) {
+ return this.fieldInvoker.getType();
}
return findPropType(getter, setter);
}
@@ -126,27 +133,27 @@ public class PropDesc {
* @return 字段类型
*/
public Class> getFieldClass() {
- if (null != this.field) {
- return TypeUtil.getClass(this.field);
+ if (null != this.fieldInvoker) {
+ return this.fieldInvoker.getTypeClass();
}
return findPropClass(getter, setter);
}
/**
- * 获取Getter方法,可能为{@code null}
+ * 获取Getter方法Invoker,可能为{@code null}
*
- * @return Getter方法
+ * @return Getter方法Invoker
*/
- public Method getGetter() {
+ public Invoker getGetter() {
return this.getter;
}
/**
- * 获取Setter方法,可能为{@code null}
+ * 获取Setter方法Invoker,可能为{@code null}
*
- * @return {@link Method}Setter 方法对象
+ * @return {@link Method}Setter 方法Invoker
*/
- public Method getSetter() {
+ public Invoker getSetter() {
return this.setter;
}
@@ -158,18 +165,27 @@ public class PropDesc {
* @since 5.4.2
*/
public boolean isReadable(final boolean checkTransient) {
- // 检查是否有getter方法或是否为public修饰
- if (null == this.getter && !ModifierUtil.isPublic(this.field)) {
- return false;
+ Field field = null;
+ if (this.fieldInvoker instanceof FieldInvoker) {
+ field = ((FieldInvoker) this.fieldInvoker).getField();
+ }
+ Method getterMethod = null;
+ if (this.getter instanceof MethodInvoker) {
+ getterMethod = ((MethodInvoker) this.getter).getMethod();
}
// 检查transient关键字和@Transient注解
- if (checkTransient && isTransientForGet()) {
+ if (checkTransient && isTransientForGet(field, getterMethod)) {
return false;
}
// 检查@PropIgnore注解
- return !isIgnoreGet();
+ if (isIgnoreGet(field, getterMethod)) {
+ return false;
+ }
+
+ // 检查是否有getter方法或是否为public修饰
+ return null != getterMethod || ModifierUtil.isPublic(field);
}
/**
@@ -183,11 +199,9 @@ public class PropDesc {
*/
public Object getValue(final Object bean) {
if (null != this.getter) {
- // issue#3671 JDK15+ 修改了lambda的策略,动态生成后在metaspace不会释放,导致资源占用高
- //return LambdaUtil.buildGetter(this.getter).apply(bean);
- return MethodUtil.invoke(bean, this.getter);
- } else if (ModifierUtil.isPublic(this.field)) {
- return FieldUtil.getFieldValue(bean, this.field);
+ return this.getter.invoke(bean);
+ } else if (null != this.fieldInvoker) {
+ return fieldInvoker.invoke(bean);
}
return null;
@@ -230,18 +244,27 @@ public class PropDesc {
* @since 5.4.2
*/
public boolean isWritable(final boolean checkTransient) {
- // 检查是否有getter方法或是否为public修饰
- if (null == this.setter && !ModifierUtil.isPublic(this.field)) {
- return false;
+ Field field = null;
+ if (this.fieldInvoker instanceof FieldInvoker) {
+ field = ((FieldInvoker) this.fieldInvoker).getField();
+ }
+ Method setterMethod = null;
+ if (this.setter instanceof MethodInvoker) {
+ setterMethod = ((MethodInvoker) this.setter).getMethod();
}
// 检查transient关键字和@Transient注解
- if (checkTransient && isTransientForSet()) {
+ if (checkTransient && isTransientForSet(field, setterMethod)) {
return false;
}
// 检查@PropIgnore注解
- return !isIgnoreSet();
+ if(isIgnoreSet(field, setterMethod)){
+ return false;
+ }
+
+ // 检查是否有setter方法或是否为public修饰
+ return null != setterMethod || ModifierUtil.isPublic(field);
}
/**
@@ -256,9 +279,9 @@ public class PropDesc {
*/
public PropDesc setValue(final Object bean, final Object value) {
if (null != this.setter) {
- MethodUtil.invoke(bean, this.setter, value);
- } else if (ModifierUtil.isPublic(this.field)) {
- FieldUtil.setFieldValue(bean, this.field, value);
+ this.setter.invoke(bean, value);
+ } else if (null != this.fieldInvoker) {
+ fieldInvoker.invoke(bean, value);
}
return this;
}
@@ -325,29 +348,29 @@ public class PropDesc {
@Override
public String toString() {
return "PropDesc{" +
- "field=" + field +
+ "field=" + fieldInvoker +
", fieldName=" + fieldName +
", getter=" + getter +
", setter=" + setter +
'}';
}
- //------------------------------------------------------------------------------------ Private method start
+ // region ----- private methods
/**
* 通过Getter和Setter方法中找到属性类型
*
- * @param getter Getter方法
- * @param setter Setter方法
+ * @param getterInvoker Getter方法Invoker
+ * @param setterInvoker Setter方法Invoker
* @return {@link Type}
*/
- private Type findPropType(final Method getter, final Method setter) {
+ private Type findPropType(final Invoker getterInvoker, final Invoker setterInvoker) {
Type type = null;
- if (null != getter) {
- type = TypeUtil.getReturnType(getter);
+ if (null != getterInvoker) {
+ type = getterInvoker.getType();
}
- if (null == type && null != setter) {
- type = TypeUtil.getParamType(setter, 0);
+ if (null == type && null != setterInvoker) {
+ type = setterInvoker.getType();
}
return type;
}
@@ -355,36 +378,21 @@ public class PropDesc {
/**
* 通过Getter和Setter方法中找到属性类型
*
- * @param getter Getter方法
- * @param setter Setter方法
+ * @param getterInvoker Getter方法Invoker
+ * @param setterInvoker Setter方法Invoker
* @return {@link Type}
*/
- private Class> findPropClass(final Method getter, final Method setter) {
+ private Class> findPropClass(final Invoker getterInvoker, final Invoker setterInvoker) {
Class> type = null;
- if (null != getter) {
- type = TypeUtil.getReturnClass(getter);
+ if (null != getterInvoker) {
+ type = getterInvoker.getTypeClass();
}
- if (null == type && null != setter) {
- type = TypeUtil.getFirstParamClass(setter);
+ if (null == type && null != setterInvoker) {
+ type = setterInvoker.getTypeClass();
}
return type;
}
- /**
- * 检查字段是否被忽略写,通过{@link PropIgnore} 注解完成,规则为:
- *
- * 1. 在字段上有{@link PropIgnore} 注解
- * 2. 在setXXX方法上有{@link PropIgnore} 注解
- *
- *
- * @return 是否忽略写
- * @since 5.4.2
- */
- private boolean isIgnoreSet() {
- return AnnotationUtil.hasAnnotation(this.field, PropIgnore.class)
- || AnnotationUtil.hasAnnotation(this.setter, PropIgnore.class);
- }
-
/**
* 检查字段是否被忽略读,通过{@link PropIgnore} 注解完成,规则为:
*
@@ -392,30 +400,48 @@ public class PropDesc {
* 2. 在getXXX方法上有{@link PropIgnore} 注解
*
*
+ * @param field 字段,可为{@code null}
+ * @param getterMethod 读取方法,可为{@code null}
* @return 是否忽略读
- * @since 5.4.2
*/
- private boolean isIgnoreGet() {
- return AnnotationUtil.hasAnnotation(this.field, PropIgnore.class)
- || AnnotationUtil.hasAnnotation(this.getter, PropIgnore.class);
+ private static boolean isIgnoreGet(final Field field, final Method getterMethod) {
+ return AnnotationUtil.hasAnnotation(field, PropIgnore.class)
+ || AnnotationUtil.hasAnnotation(getterMethod, PropIgnore.class);
+ }
+
+ /**
+ * 检查字段是否被忽略写,通过{@link PropIgnore} 注解完成,规则为:
+ *
+ * 1. 在字段上有{@link PropIgnore} 注解
+ * 2. 在setXXX方法上有{@link PropIgnore} 注解
+ *
+ *
+ * @param field 字段,可为{@code null}
+ * @param setterMethod 写方法,可为{@code null}
+ * @return 是否忽略写
+ */
+ private static boolean isIgnoreSet(final Field field, final Method setterMethod) {
+ return AnnotationUtil.hasAnnotation(field, PropIgnore.class)
+ || AnnotationUtil.hasAnnotation(setterMethod, PropIgnore.class);
}
/**
* 字段和Getter方法是否为Transient关键字修饰的
*
+ * @param field 字段,可为{@code null}
+ * @param getterMethod 读取方法,可为{@code null}
* @return 是否为Transient关键字修饰的
- * @since 5.3.11
*/
- private boolean isTransientForGet() {
- boolean isTransient = ModifierUtil.hasModifier(this.field, ModifierType.TRANSIENT);
+ private static boolean isTransientForGet(final Field field, final Method getterMethod) {
+ boolean isTransient = ModifierUtil.hasModifier(field, ModifierType.TRANSIENT);
// 检查Getter方法
- if (!isTransient && null != this.getter) {
- isTransient = ModifierUtil.hasModifier(this.getter, ModifierType.TRANSIENT);
+ if (!isTransient && null != getterMethod) {
+ isTransient = ModifierUtil.hasModifier(getterMethod, ModifierType.TRANSIENT);
// 检查注解
if (!isTransient) {
- isTransient = AnnotationUtil.hasAnnotation(this.getter, Transient.class);
+ isTransient = AnnotationUtil.hasAnnotation(getterMethod, Transient.class);
}
}
@@ -425,23 +451,24 @@ public class PropDesc {
/**
* 字段和Getter方法是否为Transient关键字修饰的
*
+ * @param field 字段,可为{@code null}
+ * @param setterMethod 写方法,可为{@code null}
* @return 是否为Transient关键字修饰的
- * @since 5.3.11
*/
- private boolean isTransientForSet() {
- boolean isTransient = ModifierUtil.hasModifier(this.field, ModifierType.TRANSIENT);
+ private static boolean isTransientForSet(final Field field, final Method setterMethod) {
+ boolean isTransient = ModifierUtil.hasModifier(field, ModifierType.TRANSIENT);
// 检查Getter方法
- if (!isTransient && null != this.setter) {
- isTransient = ModifierUtil.hasModifier(this.setter, ModifierType.TRANSIENT);
+ if (!isTransient && null != setterMethod) {
+ isTransient = ModifierUtil.hasModifier(setterMethod, ModifierType.TRANSIENT);
// 检查注解
if (!isTransient) {
- isTransient = AnnotationUtil.hasAnnotation(this.setter, Transient.class);
+ isTransient = AnnotationUtil.hasAnnotation(setterMethod, Transient.class);
}
}
return isTransient;
}
- //------------------------------------------------------------------------------------ Private method end
+ // endregion
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java
index 30fc5f7c4..9d8cba8b5 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java
@@ -17,6 +17,8 @@
package org.dromara.hutool.core.bean;
import org.dromara.hutool.core.bean.path.AbstractBeanDesc;
+import org.dromara.hutool.core.reflect.TypeUtil;
+import org.dromara.hutool.core.reflect.method.MethodInvoker;
import org.dromara.hutool.core.reflect.method.MethodNameUtil;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import org.dromara.hutool.core.util.BooleanUtil;
@@ -86,17 +88,17 @@ public class SimpleBeanDesc extends AbstractBeanDesc {
} else{
if(isSetter){
if(null == propDesc.setter ||
- propDesc.setter.getParameterTypes()[0].isAssignableFrom(method.getParameterTypes()[0])){
+ propDesc.setter.getTypeClass().isAssignableFrom(method.getParameterTypes()[0])){
// 如果存在多个重载的setter方法,选择参数类型最匹配的
- propDesc.setter = method;
+ propDesc.setter = MethodInvoker.of(method);
}
}else{
if(null == propDesc.getter ||
- (BooleanUtil.isBoolean(propDesc.getter.getReturnType()) &&
+ (BooleanUtil.isBoolean(propDesc.getter.getTypeClass()) &&
BooleanUtil.isBoolean(method.getReturnType()) &&
methodName.startsWith(MethodNameUtil.IS_PREFIX))){
// 如果返回值为Boolean或boolean,isXXX优先于getXXX
- propDesc.getter = method;
+ propDesc.getter = MethodInvoker.of(method);
}
}
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
index 96e2d2bcc..7a0b03aa3 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
@@ -259,8 +259,6 @@ public class RegisterConverter implements Converter, Serializable {
defaultConverterMap.put(AtomicLongArray.class, new AtomicLongArrayConverter());
// 其它类型
- defaultConverterMap.put(TimeZone.class, new TimeZoneConverter());
- defaultConverterMap.put(ZoneId.class, new ZoneIdConverter());
defaultConverterMap.put(Locale.class, new LocaleConverter());
defaultConverterMap.put(Charset.class, new CharsetConverter());
defaultConverterMap.put(Path.class, new PathConverter());
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/SpecialConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/SpecialConverter.java
index 575c8729e..91f242761 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/SpecialConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/SpecialConverter.java
@@ -94,6 +94,10 @@ public class SpecialConverter implements Converter, Serializable {
// // 空值转空Bean
converterSet.add(EmptyBeanConverter.INSTANCE);
+ // 日期相关
+ converterSet.add(TimeZoneConverter.INSTANCE);
+ converterSet.add(ZoneIdConverter.INSTANCE);
+
this.converterSet = converterSet;
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/TimeZoneConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/TimeZoneConverter.java
index d9332a274..fccfab9ab 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/TimeZoneConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/TimeZoneConverter.java
@@ -17,8 +17,10 @@
package org.dromara.hutool.core.convert.impl;
import org.dromara.hutool.core.convert.AbstractConverter;
+import org.dromara.hutool.core.convert.MatcherConverter;
import org.dromara.hutool.core.date.ZoneUtil;
+import java.lang.reflect.Type;
import java.time.ZoneId;
import java.util.TimeZone;
@@ -27,9 +29,19 @@ import java.util.TimeZone;
* @author Looly
*
*/
-public class TimeZoneConverter extends AbstractConverter{
+public class TimeZoneConverter extends AbstractConverter implements MatcherConverter {
private static final long serialVersionUID = 1L;
+ /**
+ * 单例
+ */
+ public static final TimeZoneConverter INSTANCE = new TimeZoneConverter();
+
+ @Override
+ public boolean match(final Type targetType, final Class> rawType, final Object value) {
+ return TimeZone.class.isAssignableFrom(rawType);
+ }
+
@Override
protected TimeZone convertInternal(final Class> targetClass, final Object value) {
if(value instanceof ZoneId){
@@ -37,5 +49,4 @@ public class TimeZoneConverter extends AbstractConverter{
}
return TimeZone.getTimeZone(convertToStr(value));
}
-
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/ZoneIdConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/ZoneIdConverter.java
index 710ff346f..d9a0062a3 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/ZoneIdConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/ZoneIdConverter.java
@@ -17,8 +17,10 @@
package org.dromara.hutool.core.convert.impl;
import org.dromara.hutool.core.convert.AbstractConverter;
+import org.dromara.hutool.core.convert.MatcherConverter;
import org.dromara.hutool.core.date.ZoneUtil;
+import java.lang.reflect.Type;
import java.time.ZoneId;
import java.util.TimeZone;
@@ -27,9 +29,19 @@ import java.util.TimeZone;
*
* @author Looly
*/
-public class ZoneIdConverter extends AbstractConverter {
+public class ZoneIdConverter extends AbstractConverter implements MatcherConverter {
private static final long serialVersionUID = 1L;
+ /**
+ * 单例
+ */
+ public static final ZoneIdConverter INSTANCE = new ZoneIdConverter();
+
+ @Override
+ public boolean match(final Type targetType, final Class> rawType, final Object value) {
+ return ZoneId.class.isAssignableFrom(rawType);
+ }
+
@Override
protected ZoneId convertInternal(final Class> targetClass, final Object value) {
if (value instanceof TimeZone) {
@@ -37,5 +49,4 @@ public class ZoneIdConverter extends AbstractConverter {
}
return ZoneId.of(convertToStr(value));
}
-
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/DateTime.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/DateTime.java
index c585c55b0..e3bf3b777 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/DateTime.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/DateTime.java
@@ -80,7 +80,7 @@ public class DateTime extends Date {
/**
* 时区
*/
- private TimeZone timeZone;
+ private transient TimeZone timeZone;
/**
* 第一周最少天数
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/func/LambdaUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/func/LambdaUtil.java
index c80cb2b5b..bd109497d 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/func/LambdaUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/func/LambdaUtil.java
@@ -24,6 +24,7 @@ import org.dromara.hutool.core.lang.Opt;
import org.dromara.hutool.core.map.reference.WeakConcurrentMap;
import org.dromara.hutool.core.reflect.ClassDescUtil;
import org.dromara.hutool.core.reflect.ModifierUtil;
+import org.dromara.hutool.core.reflect.method.MethodInvoker;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import java.io.Serializable;
@@ -171,9 +172,9 @@ public class LambdaUtil {
* @param setter方法返回的值类型
* @return Obj::setXxx
*/
- @SuppressWarnings("unchecked")
public static
* 赋值字段值:
*
@@ -30,7 +31,7 @@ import java.lang.reflect.Field;
* {@code
* FieldInvoker.of(Field).invoke(obj);
* }
- *
+ * {@code
* FieldInvoker.of(Field).invoke(obj, value);
@@ -60,7 +61,32 @@ public class FieldInvoker implements Invoker {
* @param field 字段
*/
public FieldInvoker(final Field field) {
- this.field = Assert.notNull(field);;
+ this.field = Assert.notNull(field);
+ ;
+ }
+
+ /**
+ * 获取字段
+ *
+ * @return 字段
+ */
+ public Field getField() {
+ return this.field;
+ }
+
+ @Override
+ public String getName() {
+ return this.field.getName();
+ }
+
+ @Override
+ public Type getType() {
+ return field.getGenericType();
+ }
+
+ @Override
+ public Class> getTypeClass() {
+ return field.getType();
}
/**
@@ -77,10 +103,10 @@ public class FieldInvoker implements Invoker {
@SuppressWarnings("unchecked")
@Override
public
* 它允许动态地调用方法,增强了代码的灵活性和扩展性。
@@ -36,10 +38,24 @@ public interface Invoker {
*
@@ -81,19 +118,21 @@ public class MethodInvoker implements Invoker {
@SuppressWarnings("unchecked")
@Override
- public
+ *
+ *
+ * @author Looly
+ * @since 6.0.0
+ */
+public class JSONPrimitive implements JSON {
+ private static final long serialVersionUID = -2026215279191790345L;
+
+ private Object value;
+ /**
+ * 配置项
+ */
+ private JSONConfig config;
+
+ /**
+ * 构造
+ *
+ * @param value 值
+ */
+ public JSONPrimitive(final Object value) {
+ this(value, null);
+ }
+
+ /**
+ * 构造
+ *
+ * @param value 值
+ * @param config 配置项
+ */
+ public JSONPrimitive(final Object value, final JSONConfig config) {
+ this.value = Assert.notNull(value);
+ this.config = config;
+ }
+
+ /**
+ * 获取值
+ *
+ * @return 值
+ */
+ public Object getValue() {
+ return this.value;
+ }
+
+ /**
+ * 设置值
+ *
+ * @param value 值
+ * @return this
+ */
+ public JSONPrimitive setValue(final Object value) {
+ this.value = value;
+ return this;
+ }
+
+ @Override
+ public JSONConfig config() {
+ return this.config;
+ }
+
+ /**
+ * 设置配置项
+ *
+ * @param config 配置项
+ * @return this
+ */
+ JSONPrimitive setConfig(final JSONConfig config) {
+ this.config = config;
+ return this;
+ }
+
+ @Override
+ public int size() {
+ return 1;
+ }
+
+ @Override
+ public Writer write(final Writer writer, final int indentFactor, final int indent, final Predicate