diff --git a/src/main/java/org/redkale/util/Copier.java b/src/main/java/org/redkale/util/Copier.java index 55ac77060..0b32ca9e6 100644 --- a/src/main/java/org/redkale/util/Copier.java +++ b/src/main/java/org/redkale/util/Copier.java @@ -172,9 +172,7 @@ public interface Copier extends BiFunction { * @return 复制器 */ public static Function func(final Class srcClass, final Class destClass) { - Copier copier = load(srcClass, destClass); - Creator creator = Creator.load(destClass); - return src -> copier.apply(src, creator.create()); + return func(srcClass, destClass, 0); } /** @@ -203,9 +201,26 @@ public interface Copier extends BiFunction { * @return 复制器 */ public static Function func(final Class srcClass, final Class destClass, final int options) { - Copier copier = load(srcClass, destClass, options); - Creator creator = Creator.load(destClass); - return src -> copier.apply(src, creator.create()); + if (destClass == srcClass) { + return CopierInner.funcOneCaches + .computeIfAbsent(options, t -> new ConcurrentHashMap<>()) + .computeIfAbsent(srcClass, v -> { + Copier copier = load(srcClass, destClass, options); + Creator creator = Creator.load(destClass); + Function func = src -> copier.apply(src, creator.create()); + return func; + }); + } else { + return CopierInner.funcTwoCaches + .computeIfAbsent(options, t -> new ConcurrentHashMap<>()) + .computeIfAbsent(srcClass, t -> new ConcurrentHashMap<>()) + .computeIfAbsent(destClass, v -> { + Copier copier = load(srcClass, destClass, options); + Creator creator = Creator.load(destClass); + Function func = src -> copier.apply(src, creator.create()); + return func; + }); + } } /** @@ -612,7 +627,7 @@ public interface Copier extends BiFunction { mv.visitLabel(ifLabel); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); } - + for (java.lang.reflect.Field field : srcClass.getFields()) { if (Modifier.isStatic(field.getModifiers())) { continue; @@ -995,6 +1010,10 @@ public interface Copier extends BiFunction { static final ConcurrentHashMap>> copierTwoCaches = new ConcurrentHashMap(); + static final ConcurrentHashMap> funcOneCaches = new ConcurrentHashMap(); + + static final ConcurrentHashMap>> funcTwoCaches = new ConcurrentHashMap(); + } }