Copier
This commit is contained in:
@@ -172,9 +172,7 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
|
|||||||
* @return 复制器
|
* @return 复制器
|
||||||
*/
|
*/
|
||||||
public static <S, D> Function<S, D> func(final Class<S> srcClass, final Class<D> destClass) {
|
public static <S, D> Function<S, D> func(final Class<S> srcClass, final Class<D> destClass) {
|
||||||
Copier<S, D> copier = load(srcClass, destClass);
|
return func(srcClass, destClass, 0);
|
||||||
Creator<D> creator = Creator.load(destClass);
|
|
||||||
return src -> copier.apply(src, creator.create());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -203,9 +201,26 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
|
|||||||
* @return 复制器
|
* @return 复制器
|
||||||
*/
|
*/
|
||||||
public static <S, D> Function<S, D> func(final Class<S> srcClass, final Class<D> destClass, final int options) {
|
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);
|
if (destClass == srcClass) {
|
||||||
Creator<D> creator = Creator.load(destClass);
|
return CopierInner.funcOneCaches
|
||||||
return src -> copier.apply(src, creator.create());
|
.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.visitLabel(ifLabel);
|
||||||
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (java.lang.reflect.Field field : srcClass.getFields()) {
|
for (java.lang.reflect.Field field : srcClass.getFields()) {
|
||||||
if (Modifier.isStatic(field.getModifiers())) {
|
if (Modifier.isStatic(field.getModifiers())) {
|
||||||
continue;
|
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, 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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user