This commit is contained in:
redkale
2023-08-11 23:22:22 +08:00
parent c0e2295c1c
commit 509e81888c

View File

@@ -172,9 +172,7 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
* @return 复制器
*/
public static <S, D> Function<S, D> func(final Class<S> srcClass, final Class<D> destClass) {
Copier<S, D> copier = load(srcClass, destClass);
Creator<D> creator = Creator.load(destClass);
return src -> copier.apply(src, creator.create());
return func(srcClass, destClass, 0);
}
/**
@@ -203,9 +201,26 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
* @return 复制器
*/
public static <S, D> Function<S, D> func(final Class<S> srcClass, final Class<D> destClass, final int options) {
Copier<S, D> copier = load(srcClass, destClass, options);
Creator<D> 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<S, D> copier = load(srcClass, destClass, options);
Creator<D> creator = Creator.load(destClass);
Function<S, D> 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<S, D> copier = load(srcClass, destClass, options);
Creator<D> creator = Creator.load(destClass);
Function<S, D> func = src -> copier.apply(src, creator.create());
return func;
});
}
}
/**
@@ -612,7 +627,7 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
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<S, D> extends BiFunction<S, D, D> {
static final ConcurrentHashMap<Integer, ConcurrentHashMap<Class, ConcurrentHashMap<Class, Copier>>> copierTwoCaches = new ConcurrentHashMap();
static final ConcurrentHashMap<Integer, ConcurrentHashMap<Class, Function>> funcOneCaches = new ConcurrentHashMap();
static final ConcurrentHashMap<Integer, ConcurrentHashMap<Class, ConcurrentHashMap<Class, Function>>> funcTwoCaches = new ConcurrentHashMap();
}
}