From f86f82db8de19a4168b93913c37edefbbb62490b Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 11 Oct 2024 12:26:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=94=9F=E6=88=90=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=AD=97=E8=8A=82=E7=A0=81=E6=97=B6=E7=9A=84ClassLoad?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/asm/AsmMethodBoost.java | 18 +- src/main/java/org/redkale/boot/AppConfig.java | 3 +- .../java/org/redkale/boot/NodeServer.java | 2 +- .../cached/spi/CachedAsmMethodBoost.java | 5 +- .../java/org/redkale/convert/DeMember.java | 4 + .../java/org/redkale/convert/EnMember.java | 4 + .../convert/ext/BigDecimalSimpledCoder.java | 30 -- .../convert/ext/BigIntegerSimpledCoder.java | 71 ---- .../convert/ext/InetAddressSimpledCoder.java | 67 ---- .../convert/ext/InstantSimpledCoder.java | 24 -- .../convert/ext/LocalDateSimpledCoder.java | 30 -- .../ext/LocalDateTimeSimpledCoder.java | 30 -- .../convert/ext/LocalTimeSimpledCoder.java | 30 -- .../convert/ext/Uint128SimpledCoder.java | 30 -- .../org/redkale/convert/json/JsonCoders.java | 339 ++++++++++++++++++ .../redkale/convert/json/JsonDynEncoder.java | 11 +- .../org/redkale/convert/json/JsonFactory.java | 20 +- .../convert/pb/ProtobufDynEncoder.java | 13 +- .../redkale/convert/pb/ProtobufFactory.java | 3 + .../convert/pb/ProtobufObjectDecoder.java | 8 +- .../convert/pb/ProtobufObjectEncoder.java | 8 +- .../locked/spi/LockedAsmMethodBoost.java | 8 +- .../redkale/mq/spi/MessageAsmMethodBoost.java | 7 +- .../redkale/mq/spi/MessageModuleEngine.java | 5 +- .../org/redkale/net/http/HttpContext.java | 12 +- .../org/redkale/net/http/HttpServlet.java | 11 +- src/main/java/org/redkale/net/http/Rest.java | 9 +- src/main/java/org/redkale/net/sncp/Sncp.java | 9 +- .../redkale/net/sncp/SncpActionServlet.java | 26 +- .../redkale/net/sncp/SncpAsyncHandler.java | 16 +- .../redkale/net/sncp/SncpRemoteAction.java | 33 +- .../org/redkale/net/sncp/SncpResponse.java | 14 +- .../org/redkale/source/EntityFullFunc.java | 12 +- .../source/spi/DataSqlMapperBuilder.java | 8 +- src/main/java/org/redkale/util/Attribute.java | 11 +- src/main/java/org/redkale/util/Copier.java | 8 +- src/main/java/org/redkale/util/Creator.java | 12 +- src/main/java/org/redkale/util/Inners.java | 8 +- src/main/java/org/redkale/util/Invoker.java | 11 +- .../org/redkale/util/RedkaleClassLoader.java | 74 ++-- src/main/java/org/redkale/util/Reproduce.java | 13 +- src/main/java/org/redkale/util/TypeToken.java | 8 +- .../test/convert/ConvertCoderTest.java | 2 +- .../test/convert/GenericEntityTest.java | 21 ++ .../redkale/test/convert/json/TinyTest.java | 2 + .../redkale/test/sncp/SncpSleepService.java | 2 +- .../org/redkale/test/sncp/SncpSleepTest.java | 2 +- .../sncp/dyn/DynActionTestService_insert.java | 20 +- 48 files changed, 550 insertions(+), 564 deletions(-) create mode 100644 src/main/java/org/redkale/convert/json/JsonCoders.java diff --git a/src/main/java/org/redkale/asm/AsmMethodBoost.java b/src/main/java/org/redkale/asm/AsmMethodBoost.java index 3146e4ecd..eac2d0b2a 100644 --- a/src/main/java/org/redkale/asm/AsmMethodBoost.java +++ b/src/main/java/org/redkale/asm/AsmMethodBoost.java @@ -29,7 +29,7 @@ import static org.redkale.asm.Opcodes.LLOAD; import static org.redkale.asm.Opcodes.LRETURN; import static org.redkale.asm.Opcodes.RETURN; import org.redkale.inject.ResourceFactory; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; +import org.redkale.util.RedkaleClassLoader; import org.redkale.util.Utility; /** @@ -101,7 +101,7 @@ public abstract class AsmMethodBoost { * @return 下一个新的方法名,不做任何处理应返回参数newMethodName */ public abstract AsmNewMethod doMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, Class serviceImplClass, String newDynName, @@ -119,7 +119,7 @@ public abstract class AsmMethodBoost { * @param fieldPrefix 动态字段的前缀 */ public void doAfterMethods( - DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {} + RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {} /** * 处理所有动态方法后调用 @@ -132,7 +132,7 @@ public abstract class AsmMethodBoost { * @param remote 是否远程模式 */ public void doConstructorMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, MethodVisitor mv, String newDynName, @@ -145,7 +145,7 @@ public abstract class AsmMethodBoost { * @param resourceFactory ResourceFactory * @param service 实例对象 */ - public abstract void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, T service); + public abstract void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, T service); protected AsmMethodBean getMethodBean(Method method) { Map methodBeans = AsmMethodBoost.getMethodBeans(serviceType); @@ -325,7 +325,7 @@ public abstract class AsmMethodBoost { @Override public AsmNewMethod doMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, Class serviceImplClass, String newDynName, @@ -345,7 +345,7 @@ public abstract class AsmMethodBoost { @Override public void doAfterMethods( - DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { + RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { for (AsmMethodBoost item : items) { if (item != null) { item.doAfterMethods(classLoader, cw, newDynName, fieldPrefix); @@ -355,7 +355,7 @@ public abstract class AsmMethodBoost { @Override public void doConstructorMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, MethodVisitor mv, String newDynName, @@ -369,7 +369,7 @@ public abstract class AsmMethodBoost { } @Override - public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, T service) { + public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, T service) { for (AsmMethodBoost item : items) { if (item != null) { item.doInstance(classLoader, resourceFactory, service); diff --git a/src/main/java/org/redkale/boot/AppConfig.java b/src/main/java/org/redkale/boot/AppConfig.java index 45ac00c6a..a0384814b 100644 --- a/src/main/java/org/redkale/boot/AppConfig.java +++ b/src/main/java/org/redkale/boot/AppConfig.java @@ -143,7 +143,8 @@ class AppConfig { if (cacheClasses == null) { this.classLoader = new RedkaleClassLoader(currClassLoader); } else { - this.classLoader = new RedkaleClassLoader.RedkaleCacheClassLoader(currClassLoader, cacheClasses); + this.classLoader = new RedkaleClassLoader.RedkaleCacheClassLoader( + RedkaleClassLoader.getRedkaleClassLoader(currClassLoader), cacheClasses); } Thread.currentThread().setContextClassLoader(this.classLoader); } diff --git a/src/main/java/org/redkale/boot/NodeServer.java b/src/main/java/org/redkale/boot/NodeServer.java index d2ad718c2..ff361b562 100644 --- a/src/main/java/org/redkale/boot/NodeServer.java +++ b/src/main/java/org/redkale/boot/NodeServer.java @@ -114,7 +114,7 @@ public abstract class NodeServer { || application.getServerClassLoader() instanceof RedkaleClassLoader.RedkaleCacheClassLoader) { this.serverClassLoader = application.getServerClassLoader(); } else { - this.serverClassLoader = new RedkaleClassLoader(application.getServerClassLoader()); + this.serverClassLoader = RedkaleClassLoader.getRedkaleClassLoader(application.getServerClassLoader()); } Thread.currentThread().setContextClassLoader(this.serverClassLoader); this.serverThread = Thread.currentThread(); diff --git a/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java b/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java index 8f269269c..3fcb7824b 100644 --- a/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java +++ b/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java @@ -30,7 +30,6 @@ import org.redkale.cached.Cached; import org.redkale.inject.ResourceFactory; import org.redkale.service.LoadMode; import org.redkale.util.RedkaleClassLoader; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.ThrowSupplier; import org.redkale.util.TypeToken; @@ -63,7 +62,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost { @Override public AsmNewMethod doMethod( - final DynBytesClassLoader classLoader, + final RedkaleClassLoader classLoader, final ClassWriter cw, final Class serviceImplClass, final String newDynName, @@ -216,7 +215,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost { } @Override - public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) { + public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) { Class clazz = service.getClass(); if (actionMap == null) { // 为null表示没有调用过doMethod, 动态类在编译是已经生成好了 actionMap = new LinkedHashMap<>(); diff --git a/src/main/java/org/redkale/convert/DeMember.java b/src/main/java/org/redkale/convert/DeMember.java index 603b32162..449b6100c 100644 --- a/src/main/java/org/redkale/convert/DeMember.java +++ b/src/main/java/org/redkale/convert/DeMember.java @@ -102,6 +102,10 @@ public final class DeMember { return new DeMember<>(attribute, factory.loadDecoder(fieldType), null, null); } + public void setPositionToIndex() { + this.index = this.position; + } + public final boolean accepts(String name) { return attribute.field().equals(name); } diff --git a/src/main/java/org/redkale/convert/EnMember.java b/src/main/java/org/redkale/convert/EnMember.java index db3142754..e15f69c48 100644 --- a/src/main/java/org/redkale/convert/EnMember.java +++ b/src/main/java/org/redkale/convert/EnMember.java @@ -127,6 +127,10 @@ public final class EnMember { return new EnMember<>(attribute, factory.loadEncoder(fieldtype), null, null, null); } + public void setPositionToIndex() { + this.index = this.position; + } + public Object getFieldValue(T obj) { F val = attribute.get(obj); if (fieldFunc != null) { diff --git a/src/main/java/org/redkale/convert/ext/BigDecimalSimpledCoder.java b/src/main/java/org/redkale/convert/ext/BigDecimalSimpledCoder.java index 401424586..7d6f97b8c 100644 --- a/src/main/java/org/redkale/convert/ext/BigDecimalSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/BigDecimalSimpledCoder.java @@ -7,7 +7,6 @@ package org.redkale.convert.ext; import java.math.BigDecimal; import org.redkale.convert.*; -import org.redkale.convert.json.*; import org.redkale.util.Utility; /** @@ -41,33 +40,4 @@ public class BigDecimalSimpledCoder extends return new BigDecimal(Utility.charArray(value)); } - /** - * BigDecimal 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static class BigDecimalJsonSimpledCoder - extends SimpledCoder { - - public static final BigDecimalJsonSimpledCoder instance = new BigDecimalJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final BigDecimal value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public BigDecimal convertFrom(R in) { - final String str = in.readString(); - if (str == null) { - return null; - } - return new BigDecimal(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/BigIntegerSimpledCoder.java b/src/main/java/org/redkale/convert/ext/BigIntegerSimpledCoder.java index d4eac9b26..e08f1328d 100644 --- a/src/main/java/org/redkale/convert/ext/BigIntegerSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/BigIntegerSimpledCoder.java @@ -8,7 +8,6 @@ package org.redkale.convert.ext; import java.math.BigInteger; import java.util.Objects; import org.redkale.convert.*; -import org.redkale.convert.json.*; /** * BigInteger 的SimpledCoder实现 @@ -50,74 +49,4 @@ public class BigIntegerSimpledCoder extends return bytes == null ? null : new BigInteger(bytes); } - /** - * BigInteger 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static class BigIntegerJsonSimpledCoder - extends SimpledCoder { - - public static final BigIntegerJsonSimpledCoder instance = new BigIntegerJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final BigInteger value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public BigInteger convertFrom(R in) { - final String str = in.readString(); - if (str == null) { - return null; - } - return new BigInteger(str); - } - } - - /** - * BigInteger 的十六进制JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static class BigIntegerHexJsonSimpledCoder - extends SimpledCoder { - - public static final BigIntegerHexJsonSimpledCoder instance = new BigIntegerHexJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final BigInteger value) { - if (value == null) { - out.writeNull(); - } else { - String s = value.toString(16); - out.writeStandardString(s.charAt(0) == '-' ? ("-0x" + s.substring(1)) : ("0x" + s)); - } - } - - @Override - public BigInteger convertFrom(R in) { - final String str = in.readString(); - if (str == null) { - return null; - } - if (str.length() > 2) { - if (str.charAt(0) == '0' && (str.charAt(1) == 'x' || str.charAt(1) == 'X')) { - return new BigInteger(str.substring(2), 16); - } else if (str.charAt(0) == '-' - && str.length() > 3 - && str.charAt(1) == '0' - && (str.charAt(2) == 'x' || str.charAt(2) == 'X')) { - return new BigInteger("-" + str.substring(3), 16); - } - } - return new BigInteger(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java b/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java index c508710eb..2af0d87de 100644 --- a/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java @@ -9,8 +9,6 @@ import java.net.*; import java.util.Arrays; import java.util.Objects; import org.redkale.convert.*; -import org.redkale.convert.json.*; -import org.redkale.util.StringWrapper; import org.redkale.util.Utility; /** @@ -108,69 +106,4 @@ public class InetAddressSimpledCoder extends } } } - - /** - * InetAddress 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static final class InetAddressJsonSimpledCoder - extends SimpledCoder { - - public static final InetAddressJsonSimpledCoder instance = new InetAddressJsonSimpledCoder(); - - @Override - public void convertTo(W out, InetAddress value) { - if (value == null) { - out.writeNull(); - return; - } - out.writeWrapper(new StringWrapper(value.getHostAddress())); - } - - @Override - public InetAddress convertFrom(R in) { - String str = in.readString(); - if (str == null) { - return null; - } - try { - return InetAddress.getByName(str); - } catch (Exception ex) { - return null; - } - } - } - - /** - * InetSocketAddress 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static final class InetSocketAddressJsonSimpledCoder - extends SimpledCoder { - - public static final InetSocketAddressJsonSimpledCoder instance = new InetSocketAddressJsonSimpledCoder(); - - @Override - public void convertTo(W out, InetSocketAddress value) { - if (value == null) { - out.writeNull(); - return; - } - StringSimpledCoder.instance.convertTo(out, value.getHostString() + ":" + value.getPort()); - } - - @Override - public InetSocketAddress convertFrom(R in) { - String str = in.readStringValue(); - if (str == null) { - return null; - } - int pos = str.indexOf(':'); - return new InetSocketAddress(str.substring(0, pos), Integer.parseInt(str.substring(pos + 1))); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/InstantSimpledCoder.java b/src/main/java/org/redkale/convert/ext/InstantSimpledCoder.java index bafafcb73..dbf280879 100644 --- a/src/main/java/org/redkale/convert/ext/InstantSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/InstantSimpledCoder.java @@ -7,7 +7,6 @@ package org.redkale.convert.ext; import java.time.Instant; import org.redkale.convert.*; -import org.redkale.convert.json.*; /** * java.time.Instant 的SimpledCoder实现 @@ -33,27 +32,4 @@ public class InstantSimpledCoder extends Sim return t == -1 ? null : Instant.ofEpochMilli(t); } - public static final class InstantJsonSimpledCoder - extends SimpledCoder { - - public static final InstantJsonSimpledCoder instance = new InstantJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final Instant value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public Instant convertFrom(R in) { - final String str = in.readStandardString(); - if (str == null) { - return null; - } - return Instant.parse(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java index ad3c7869a..f63653c7e 100644 --- a/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java @@ -7,7 +7,6 @@ package org.redkale.convert.ext; import java.time.LocalDate; import org.redkale.convert.*; -import org.redkale.convert.json.*; /** * java.time.LocalDate 的SimpledCoder实现 @@ -34,33 +33,4 @@ public class LocalDateSimpledCoder extends S return t == 0 ? null : LocalDate.of(t / 100_00, t % 100_00 / 100, t % 100); } - /** - * java.time.LocalDate 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static final class LocalDateJsonSimpledCoder - extends SimpledCoder { - - public static final LocalDateJsonSimpledCoder instance = new LocalDateJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final LocalDate value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public LocalDate convertFrom(R in) { - final String str = in.readStandardString(); - if (str == null) { - return null; - } - return LocalDate.parse(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java index f2e5c52a3..d464ba98f 100644 --- a/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java @@ -8,7 +8,6 @@ package org.redkale.convert.ext; import java.time.*; import java.util.Objects; import org.redkale.convert.*; -import org.redkale.convert.json.*; /** * java.time.LocalDateTime 的SimpledCoder实现 @@ -76,33 +75,4 @@ public class LocalDateTimeSimpledCoder exten return LocalDateTime.ofEpochSecond(v1, v2, ZoneOffset.UTC); } - /** - * java.time.LocalDateTime 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static final class LocalDateTimeJsonSimpledCoder - extends SimpledCoder { - - public static final LocalDateTimeJsonSimpledCoder instance = new LocalDateTimeJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final LocalDateTime value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public LocalDateTime convertFrom(R in) { - final String str = in.readStandardString(); - if (str == null) { - return null; - } - return LocalDateTime.parse(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java index 29212a213..7e6129d49 100644 --- a/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java @@ -7,7 +7,6 @@ package org.redkale.convert.ext; import java.time.LocalTime; import org.redkale.convert.*; -import org.redkale.convert.json.*; /** * java.time.LocalTime 的SimpledCoder实现 @@ -33,33 +32,4 @@ public class LocalTimeSimpledCoder extends S return t == -1 ? null : LocalTime.ofNanoOfDay(t); } - /** - * java.time.LocalTime 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static final class LocalTimeJsonSimpledCoder - extends SimpledCoder { - - public static final LocalTimeJsonSimpledCoder instance = new LocalTimeJsonSimpledCoder(); - - @Override - public void convertTo(final W out, final LocalTime value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public LocalTime convertFrom(R in) { - final String str = in.readStandardString(); - if (str == null) { - return null; - } - return LocalTime.parse(str); - } - } } diff --git a/src/main/java/org/redkale/convert/ext/Uint128SimpledCoder.java b/src/main/java/org/redkale/convert/ext/Uint128SimpledCoder.java index df1e6c3cb..072907a29 100644 --- a/src/main/java/org/redkale/convert/ext/Uint128SimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/Uint128SimpledCoder.java @@ -7,7 +7,6 @@ package org.redkale.convert.ext; import java.util.Objects; import org.redkale.convert.*; -import org.redkale.convert.json.*; import org.redkale.util.*; /** @@ -53,33 +52,4 @@ public class Uint128SimpledCoder extends Sim return Uint128.create(bs); } - /** - * Uint128 的JsonSimpledCoder实现 - * - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ - public static class Uint128JsonSimpledCoder - extends SimpledCoder { - - public static final Uint128JsonSimpledCoder instance = new Uint128JsonSimpledCoder(); - - @Override - public void convertTo(final W out, final Uint128 value) { - if (value == null) { - out.writeNull(); - } else { - out.writeStandardString(value.toString()); - } - } - - @Override - public Uint128 convertFrom(R in) { - final String str = in.readStandardString(); - if (str == null) { - return null; - } - return Uint128.create(Utility.hexToBin(str)); - } - } } diff --git a/src/main/java/org/redkale/convert/json/JsonCoders.java b/src/main/java/org/redkale/convert/json/JsonCoders.java new file mode 100644 index 000000000..35f0ec73e --- /dev/null +++ b/src/main/java/org/redkale/convert/json/JsonCoders.java @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.convert.json; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import org.redkale.convert.SimpledCoder; +import org.redkale.convert.ext.StringSimpledCoder; +import org.redkale.util.StringWrapper; +import org.redkale.util.Uint128; +import org.redkale.util.Utility; + +/** + * + * @author zhangjx + */ +public abstract class JsonCoders { + + private JsonCoders() { + // do nothing + } + + /** + * InetAddress 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static final class InetAddressJsonSimpledCoder + extends SimpledCoder { + + public static final InetAddressJsonSimpledCoder instance = new InetAddressJsonSimpledCoder(); + + @Override + public void convertTo(W out, InetAddress value) { + if (value == null) { + out.writeNull(); + return; + } + out.writeWrapper(new StringWrapper(value.getHostAddress())); + } + + @Override + public InetAddress convertFrom(R in) { + String str = in.readString(); + if (str == null) { + return null; + } + try { + return InetAddress.getByName(str); + } catch (Exception ex) { + return null; + } + } + } + + /** + * InetSocketAddress 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static final class InetSocketAddressJsonSimpledCoder + extends SimpledCoder { + + public static final InetSocketAddressJsonSimpledCoder instance = new InetSocketAddressJsonSimpledCoder(); + + @Override + public void convertTo(W out, InetSocketAddress value) { + if (value == null) { + out.writeNull(); + return; + } + StringSimpledCoder.instance.convertTo(out, value.getHostString() + ":" + value.getPort()); + } + + @Override + public InetSocketAddress convertFrom(R in) { + String str = in.readStringValue(); + if (str == null) { + return null; + } + int pos = str.indexOf(':'); + return new InetSocketAddress(str.substring(0, pos), Integer.parseInt(str.substring(pos + 1))); + } + } + /** + * Uint128 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static class Uint128JsonSimpledCoder + extends SimpledCoder { + + public static final Uint128JsonSimpledCoder instance = new Uint128JsonSimpledCoder(); + + @Override + public void convertTo(final W out, final Uint128 value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public Uint128 convertFrom(R in) { + final String str = in.readStandardString(); + if (str == null) { + return null; + } + return Uint128.create(Utility.hexToBin(str)); + } + } + + /** + * BigInteger 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static class BigIntegerJsonSimpledCoder + extends SimpledCoder { + + public static final BigIntegerJsonSimpledCoder instance = new BigIntegerJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final BigInteger value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public BigInteger convertFrom(R in) { + final String str = in.readString(); + if (str == null) { + return null; + } + return new BigInteger(str); + } + } + + /** + * BigInteger 的十六进制JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static class BigIntegerHexJsonSimpledCoder + extends SimpledCoder { + + public static final BigIntegerHexJsonSimpledCoder instance = new BigIntegerHexJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final BigInteger value) { + if (value == null) { + out.writeNull(); + } else { + String s = value.toString(16); + out.writeStandardString(s.charAt(0) == '-' ? ("-0x" + s.substring(1)) : ("0x" + s)); + } + } + + @Override + public BigInteger convertFrom(R in) { + final String str = in.readString(); + if (str == null) { + return null; + } + if (str.length() > 2) { + if (str.charAt(0) == '0' && (str.charAt(1) == 'x' || str.charAt(1) == 'X')) { + return new BigInteger(str.substring(2), 16); + } else if (str.charAt(0) == '-' + && str.length() > 3 + && str.charAt(1) == '0' + && (str.charAt(2) == 'x' || str.charAt(2) == 'X')) { + return new BigInteger("-" + str.substring(3), 16); + } + } + return new BigInteger(str); + } + } + + /** + * BigDecimal 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static class BigDecimalJsonSimpledCoder + extends SimpledCoder { + + public static final BigDecimalJsonSimpledCoder instance = new BigDecimalJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final BigDecimal value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public BigDecimal convertFrom(R in) { + final String str = in.readString(); + if (str == null) { + return null; + } + return new BigDecimal(str); + } + } + + public static final class InstantJsonSimpledCoder + extends SimpledCoder { + + public static final InstantJsonSimpledCoder instance = new InstantJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final Instant value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public Instant convertFrom(R in) { + final String str = in.readStandardString(); + if (str == null) { + return null; + } + return Instant.parse(str); + } + } + + /** + * java.time.LocalDate 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static final class LocalDateJsonSimpledCoder + extends SimpledCoder { + + public static final LocalDateJsonSimpledCoder instance = new LocalDateJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final LocalDate value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public LocalDate convertFrom(R in) { + final String str = in.readStandardString(); + if (str == null) { + return null; + } + return LocalDate.parse(str); + } + } + + /** + * java.time.LocalTime 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static final class LocalTimeJsonSimpledCoder + extends SimpledCoder { + + public static final LocalTimeJsonSimpledCoder instance = new LocalTimeJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final LocalTime value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public LocalTime convertFrom(R in) { + final String str = in.readStandardString(); + if (str == null) { + return null; + } + return LocalTime.parse(str); + } + } + + /** + * java.time.LocalDateTime 的JsonSimpledCoder实现 + * + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ + public static final class LocalDateTimeJsonSimpledCoder + extends SimpledCoder { + + public static final LocalDateTimeJsonSimpledCoder instance = new LocalDateTimeJsonSimpledCoder(); + + @Override + public void convertTo(final W out, final LocalDateTime value) { + if (value == null) { + out.writeNull(); + } else { + out.writeStandardString(value.toString()); + } + } + + @Override + public LocalDateTime convertFrom(R in) { + final String str = in.readStandardString(); + if (str == null) { + return null; + } + return LocalDateTime.parse(str); + } + } +} diff --git a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java index 483b8291f..85ade2afc 100644 --- a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java +++ b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java @@ -66,10 +66,7 @@ public abstract class JsonDynEncoder extends ObjectEncoder { } } final Map mixedNames = mixedNames0; - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != clazz.getClassLoader()) { - loader = clazz.getClassLoader(); - } + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/convert/json/_Dyn" + JsonDynEncoder.class.getSimpleName() + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_" + Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert @@ -683,11 +680,7 @@ public abstract class JsonDynEncoder extends ObjectEncoder { cw.visitEnd(); // ------------------------------------------------------------------------------ byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors( newClazz, newDynName.replace('/', '.'), JsonFactory.class, Type.class); diff --git a/src/main/java/org/redkale/convert/json/JsonFactory.java b/src/main/java/org/redkale/convert/json/JsonFactory.java index 2bd5e438f..33a5c2def 100644 --- a/src/main/java/org/redkale/convert/json/JsonFactory.java +++ b/src/main/java/org/redkale/convert/json/JsonFactory.java @@ -10,7 +10,6 @@ import java.lang.reflect.Type; import java.math.*; import java.net.*; import org.redkale.convert.*; -import org.redkale.convert.ext.*; import org.redkale.util.Uint128; /** @@ -42,16 +41,15 @@ public final class JsonFactory extends ConvertFactory { private JsonFactory(JsonFactory parent, int features) { super(parent, features); if (parent == null) { - this.register(InetAddress.class, InetAddressSimpledCoder.InetAddressJsonSimpledCoder.instance); - this.register(InetSocketAddress.class, InetAddressSimpledCoder.InetSocketAddressJsonSimpledCoder.instance); - this.register(Uint128.class, Uint128SimpledCoder.Uint128JsonSimpledCoder.instance); - this.register(BigInteger.class, BigIntegerSimpledCoder.BigIntegerJsonSimpledCoder.instance); - this.register(BigDecimal.class, BigDecimalSimpledCoder.BigDecimalJsonSimpledCoder.instance); - this.register(java.time.Instant.class, InstantSimpledCoder.InstantJsonSimpledCoder.instance); - this.register(java.time.LocalDate.class, LocalDateSimpledCoder.LocalDateJsonSimpledCoder.instance); - this.register(java.time.LocalTime.class, LocalTimeSimpledCoder.LocalTimeJsonSimpledCoder.instance); - this.register( - java.time.LocalDateTime.class, LocalDateTimeSimpledCoder.LocalDateTimeJsonSimpledCoder.instance); + this.register(InetAddress.class, JsonCoders.InetAddressJsonSimpledCoder.instance); + this.register(InetSocketAddress.class, JsonCoders.InetSocketAddressJsonSimpledCoder.instance); + this.register(Uint128.class, JsonCoders.Uint128JsonSimpledCoder.instance); + this.register(BigInteger.class, JsonCoders.BigIntegerJsonSimpledCoder.instance); + this.register(BigDecimal.class, JsonCoders.BigDecimalJsonSimpledCoder.instance); + this.register(java.time.Instant.class, JsonCoders.InstantJsonSimpledCoder.instance); + this.register(java.time.LocalDate.class, JsonCoders.LocalDateJsonSimpledCoder.instance); + this.register(java.time.LocalTime.class, JsonCoders.LocalTimeJsonSimpledCoder.instance); + this.register(java.time.LocalDateTime.class, JsonCoders.LocalDateTimeJsonSimpledCoder.instance); this.register(JsonElement.class, (Decodeable) JsonElementDecoder.instance); this.register(JsonString.class, (Decodeable) JsonElementDecoder.instance); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java index c88df20cd..b917add91 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java @@ -47,6 +47,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { protected static ProtobufDynEncoder generateDyncEncoder(final ProtobufFactory factory, final Class clazz) { final ObjectEncoder selfObjEncoder = factory.createObjectEncoder(clazz); + factory.register(clazz, selfObjEncoder); selfObjEncoder.init(factory); // 必须执行,初始化EnMember内部信息 final Map simpledCoders = new HashMap<>(); @@ -68,10 +69,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { } } - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != clazz.getClassLoader()) { - loader = clazz.getClassLoader(); - } + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/convert/pb/_Dyn" + ProtobufDynEncoder.class.getSimpleName() + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_" + Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert @@ -323,12 +321,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = (Class) - new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java index 741d8d95b..10293a759 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -21,6 +21,9 @@ import org.redkale.util.*; /** @author zhangjx */ public class ProtobufFactory extends ConvertFactory { + static final boolean INDEX_CHECK = + "true".equalsIgnoreCase(System.getProperty("redkale.convert.protobuf.indexcheck", "false")); + private static final ProtobufFactory instance = new ProtobufFactory( null, getSystemPropertyInt("redkale.convert.protobuf.tiny", "redkale.convert.tiny", true, Convert.FEATURE_TINY) diff --git a/src/main/java/org/redkale/convert/pb/ProtobufObjectDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufObjectDecoder.java index 3c9c60299..2a599a5c5 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufObjectDecoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufObjectDecoder.java @@ -37,8 +37,12 @@ public class ProtobufObjectDecoder extends ObjectDecoder @Override protected void initForEachDeMember(ConvertFactory factory, DeMember member) { if (member.getIndex() < 1) { - throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @" - + ConvertColumn.class.getSimpleName() + ".index"); + if (ProtobufFactory.INDEX_CHECK) { + throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @" + + ConvertColumn.class.getSimpleName() + ".index"); + } else { + member.setPositionToIndex(); + } } Attribute attr = member.getAttribute(); boolean enumtostring = ((ProtobufFactory) factory).enumtostring; diff --git a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java index a0d9d0771..7e916def3 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java @@ -85,8 +85,12 @@ public class ProtobufObjectEncoder extends ObjectEncoder @Override protected void initForEachEnMember(ConvertFactory factory, EnMember member) { if (member.getIndex() < 1) { - throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @" - + ConvertColumn.class.getSimpleName() + ".index"); + if (ProtobufFactory.INDEX_CHECK) { + throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @" + + ConvertColumn.class.getSimpleName() + ".index"); + } else { + member.setPositionToIndex(); + } } Attribute attr = member.getAttribute(); boolean enumtostring = ((ProtobufFactory) factory).enumtostring; diff --git a/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java b/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java index 028ee33a7..953c0c088 100644 --- a/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java +++ b/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java @@ -20,7 +20,7 @@ import org.redkale.asm.Type; import org.redkale.inject.ResourceFactory; import org.redkale.locked.Locked; import org.redkale.service.LoadMode; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; +import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; /** @author zhangjx */ @@ -39,7 +39,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost { @Override public AsmNewMethod doMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, Class serviceImplClass, String newDynName, @@ -91,12 +91,12 @@ public class LockedAsmMethodBoost extends AsmMethodBoost { } @Override - public void doAfterMethods(DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { + public void doAfterMethods(RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { // do nothing } @Override - public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) { + public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) { // do nothing } } diff --git a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java index 0dc1294fc..a46dc6515 100644 --- a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java +++ b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java @@ -53,7 +53,6 @@ import org.redkale.mq.ResourceConsumer; import org.redkale.mq.spi.DynForMessaged.DynForMessageds; import org.redkale.service.LoadMode; import org.redkale.util.RedkaleClassLoader; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.TypeToken; import org.redkale.util.Utility; @@ -83,7 +82,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { @Override public AsmNewMethod doMethod( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, ClassWriter cw, Class serviceImplClass, String newDynName, @@ -322,7 +321,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { } @Override - public void doAfterMethods(DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { + public void doAfterMethods(RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) { if (Utility.isNotEmpty(consumerBytes)) { AnnotationVisitor av0 = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(DynForMessageds.class), true); AnnotationVisitor av1 = av0.visitArray("value"); @@ -342,7 +341,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { } @Override - public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) { + public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) { DynForMessaged[] dyns = service.getClass().getAnnotationsByType(DynForMessaged.class); if (Utility.isNotEmpty(dyns)) { try { diff --git a/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java b/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java index bd0b6a6e1..064c0b833 100644 --- a/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java +++ b/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java @@ -47,7 +47,6 @@ import org.redkale.service.Service; import org.redkale.util.AnyValue; import org.redkale.util.AnyValueWriter; import org.redkale.util.RedkaleClassLoader; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.Utility; @@ -455,11 +454,11 @@ public class MessageModuleEngine extends ModuleEngine { } } if (boost != null && Utility.isNotEmpty(boost.consumerBytes)) { - DynBytesClassLoader classLoader = DynBytesClassLoader.create(null); + RedkaleClassLoader classLoader = RedkaleClassLoader.getRedkaleClassLoader(); boost.consumerBytes.forEach((innerFullName, bytes) -> { try { String clzName = innerFullName.replace('/', '.'); - Class clazz = (Class) classLoader.loadClass(clzName, bytes); + Class clazz = classLoader.loadClass(clzName, bytes); RedkaleClassLoader.putDynClass(clzName, bytes, clazz); RedkaleClassLoader.putReflectionPublicConstructors(clazz, clzName); MessageConsumer consumer = (MessageConsumer) clazz.getConstructors()[0].newInstance(service); diff --git a/src/main/java/org/redkale/net/http/HttpContext.java b/src/main/java/org/redkale/net/http/HttpContext.java index f33c6d139..e28df25bf 100644 --- a/src/main/java/org/redkale/net/http/HttpContext.java +++ b/src/main/java/org/redkale/net/http/HttpContext.java @@ -108,11 +108,10 @@ public class HttpContext extends Context { final String handlerDesc = Type.getDescriptor(CompletionHandler.class); final String newDynName = "org/redkaledyn/http/handler/_DynHttpAsyncHandler__" + handlerClass.getName().replace('.', '/').replace('$', '_'); + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); - Class newHandlerClazz = clz == null - ? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')) - : clz; + Class newHandlerClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz; return Creator.create(newHandlerClazz); } catch (Throwable ex) { // do nothing @@ -214,12 +213,7 @@ public class HttpContext extends Context { } cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = (Class) - new ClassLoader(handlerClass.getClassLoader()) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); return (Creator) Creator.create(newClazz); } diff --git a/src/main/java/org/redkale/net/http/HttpServlet.java b/src/main/java/org/redkale/net/http/HttpServlet.java index a96045ec6..747d0c490 100644 --- a/src/main/java/org/redkale/net/http/HttpServlet.java +++ b/src/main/java/org/redkale/net/http/HttpServlet.java @@ -560,13 +560,12 @@ public class HttpServlet extends Servlet for (Class cz : method.getParameterTypes()) { tmpps.append("__").append(cz.getName().replace('.', '_')); } + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/http/servlet/action/_DynHttpActionServlet__" + this.getClass().getName().replace('.', '_').replace('$', '_') + "__" + method.getName() + tmpps; try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); - Class newClazz = clz == null - ? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')) - : clz; + Class newClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz; HttpServlet instance = (HttpServlet) newClazz.getDeclaredConstructor().newInstance(); instance.getClass().getField("_factServlet").set(instance, this); @@ -627,11 +626,7 @@ public class HttpServlet extends Servlet cw.visitEnd(); // ------------------------------------------------------------------------------ byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(this.getClass().getClassLoader()) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/net/http/Rest.java b/src/main/java/org/redkale/net/http/Rest.java index b7fd9862b..c3a0ca9f1 100644 --- a/src/main/java/org/redkale/net/http/Rest.java +++ b/src/main/java/org/redkale/net/http/Rest.java @@ -29,7 +29,6 @@ import org.redkale.net.sncp.Sncp; import org.redkale.service.*; import org.redkale.source.Flipper; import org.redkale.util.*; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; import static org.redkale.util.Utility.isEmpty; /** @@ -661,7 +660,7 @@ public final class Rest { mv.visitEnd(); } - DynBytesClassLoader newLoader = new DynBytesClassLoader(loader); + RedkaleClassLoader newLoader = RedkaleClassLoader.getRedkaleClassLoader(loader); Map msgclassToAnnotations = new HashMap<>(); for (int i = 0; i < messageMethods.size(); i++) { // _DyncXXXWebSocketMessage 子消息List final Method method = messageMethods.get(i); @@ -1990,7 +1989,7 @@ public final class Rest { return null; // 没有可HttpMapping的方法 } Collections.sort(entrys); - DynBytesClassLoader newLoader = new DynBytesClassLoader(loader); + RedkaleClassLoader newLoader = RedkaleClassLoader.getRedkaleClassLoader(loader); final int moduleid = controller == null ? 0 : controller.moduleid(); { // 注入 @WebServlet 注解 String urlpath = ""; @@ -4073,7 +4072,7 @@ public final class Rest { } cw2.visitEnd(); byte[] bytes = cw2.toByteArray(); - newLoader.addClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); + newLoader.addDynClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); innerClassBytesMap.put((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); } } // end for each @@ -4237,7 +4236,7 @@ public final class Rest { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - newLoader.addClass(newDynName.replace('/', '.'), bytes); + newLoader.addDynClass(newDynName.replace('/', '.'), bytes); try { Class newClazz = newLoader.findClass(newDynName.replace('/', '.')); innerClassBytesMap.forEach((n, bs) -> { diff --git a/src/main/java/org/redkale/net/sncp/Sncp.java b/src/main/java/org/redkale/net/sncp/Sncp.java index e1bc96eb8..7a4d59ef3 100644 --- a/src/main/java/org/redkale/net/sncp/Sncp.java +++ b/src/main/java/org/redkale/net/sncp/Sncp.java @@ -26,7 +26,6 @@ import org.redkale.scheduled.Scheduled; import org.redkale.service.*; import org.redkale.util.AnyValue; import org.redkale.util.RedkaleClassLoader; -import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader; import org.redkale.util.TypeToken; import org.redkale.util.Uint128; import org.redkale.util.Utility; @@ -492,7 +491,7 @@ public abstract class Sncp { */ @SuppressWarnings("unchecked") protected static Class createLocalServiceClass( - DynBytesClassLoader dynLoader, + RedkaleClassLoader dynLoader, final String name, final Class serviceImplClass, final AsmMethodBoost methodBoost) { @@ -626,7 +625,7 @@ public abstract class Sncp { } private static void createNewMethods( - DynBytesClassLoader classLoader, + RedkaleClassLoader classLoader, Class clazz, final AsmMethodBoost methodBoost, Set methodKeys, @@ -766,7 +765,7 @@ public abstract class Sncp { final String remoteGroup, final AnyValue conf) { try { - final DynBytesClassLoader dynLoader = DynBytesClassLoader.create(classLoader); + final RedkaleClassLoader dynLoader = RedkaleClassLoader.getRedkaleClassLoader(classLoader); final Class newClazz = createLocalServiceClass(dynLoader, name, serviceImplClass, methodBoost); T service = (T) newClazz.getDeclaredConstructor().newInstance(); // -------------------------------------- @@ -939,7 +938,7 @@ public abstract class Sncp { final String sncpInfoDesc = Type.getDescriptor(SncpRemoteInfo.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); - final DynBytesClassLoader dynLoader = DynBytesClassLoader.create(classLoader); + final RedkaleClassLoader dynLoader = RedkaleClassLoader.getRedkaleClassLoader(classLoader); String newDynName = "org/redkaledyn/service/remote/_DynRemoteService__" + serviceTypeOrImplClass.getName().replace('.', '_').replace('$', '_'); if (!name.isEmpty()) { diff --git a/src/main/java/org/redkale/net/sncp/SncpActionServlet.java b/src/main/java/org/redkale/net/sncp/SncpActionServlet.java index 5e4b9cc61..9940fba0f 100644 --- a/src/main/java/org/redkale/net/sncp/SncpActionServlet.java +++ b/src/main/java/org/redkale/net/sncp/SncpActionServlet.java @@ -74,7 +74,7 @@ public abstract class SncpActionServlet extends SncpServlet { this.actionid = actionid; this.method = method; this.paramComposeBeanType = SncpRemoteAction.createParamComposeBeanType( - Thread.currentThread().getContextClassLoader(), + RedkaleClassLoader.getRedkaleClassLoader(), Sncp.getServiceType(service), method, actionid, @@ -356,10 +356,7 @@ public abstract class SncpActionServlet extends SncpServlet { final boolean boolReturnTypeFuture = Future.class.isAssignableFrom(method.getReturnType()); final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionServlet__" + resourceType.getSimpleName() + "_" + method.getName() + "_" + actionid; - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != serviceClass.getClassLoader()) { - loader = serviceClass.getClassLoader(); - } + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); Class newClazz = null; try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); @@ -630,11 +627,13 @@ public abstract class SncpActionServlet extends SncpServlet { mv.visitVarInsn(ASTORE, 5); // paramBean // 给CompletionHandler参数赋值 - mv.visitVarInsn(ALOAD, 5); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEVIRTUAL, responseName, "getParamAsyncHandler", "()" + handlerDesc, false); - mv.visitFieldInsn(PUTFIELD, paramComposeBeanName, "arg3", handlerDesc); - + if (handlerFuncIndex >= 0) { + mv.visitVarInsn(ALOAD, 5); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn( + INVOKEVIRTUAL, responseName, "getParamAsyncHandler", "()" + handlerDesc, false); + mv.visitFieldInsn(PUTFIELD, paramComposeBeanName, "arg" + (handlerFuncIndex + 1), handlerDesc); + } // 调用service() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "service", "()" + serviceDesc, false); @@ -713,13 +712,10 @@ public abstract class SncpActionServlet extends SncpServlet { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); + try { RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), newClazz.getField("service")); } catch (Exception e) { diff --git a/src/main/java/org/redkale/net/sncp/SncpAsyncHandler.java b/src/main/java/org/redkale/net/sncp/SncpAsyncHandler.java index 9c06ff1ca..11c39d3c5 100644 --- a/src/main/java/org/redkale/net/sncp/SncpAsyncHandler.java +++ b/src/main/java/org/redkale/net/sncp/SncpAsyncHandler.java @@ -3,13 +3,12 @@ */ package org.redkale.net.sncp; -import static org.redkale.asm.Opcodes.*; - import java.lang.reflect.*; import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import org.redkale.asm.*; +import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; import org.redkale.util.*; @@ -55,11 +54,10 @@ public interface SncpAsyncHandler extends CompletionHandler { final String realHandlerDesc = Type.getDescriptor(CompletionHandler.class); final String newDynName = "org/redkaledyn/sncp/handler/_Dyn" + sncpHandlerClass.getSimpleName() + "__" + handlerClass.getName().replace('.', '/').replace('$', '_'); + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); - Class newHandlerClazz = clz == null - ? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')) - : clz; + Class newHandlerClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz; return (Creator) Creator.create(newHandlerClazz); } catch (Throwable ex) { // do nothing @@ -208,13 +206,7 @@ public interface SncpAsyncHandler extends CompletionHandler { } cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = - new ClassLoader((handlerClass != CompletionHandler.class ? handlerClass : sncpHandlerClass) - .getClassLoader()) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); return (Creator) Creator.create(newClazz); }) diff --git a/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java b/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java index adcb313cd..489931c2f 100644 --- a/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java +++ b/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java @@ -26,7 +26,9 @@ import org.redkale.asm.FieldVisitor; import org.redkale.asm.MethodDebugVisitor; import static org.redkale.asm.Opcodes.*; import org.redkale.convert.ConvertColumn; +import org.redkale.convert.Encodeable; import org.redkale.convert.ObjectEncoder; +import org.redkale.convert.SimpledCoder; import org.redkale.convert.pb.ProtobufFactory; import org.redkale.service.RpcAttachment; import org.redkale.service.RpcSourceAddress; @@ -99,7 +101,12 @@ public final class SncpRemoteAction { this.paramTypes = TypeToken.getGenericType(method.getGenericParameterTypes(), serviceImplClass); this.paramClasses = method.getParameterTypes(); Type pt = createParamComposeBeanType( - serviceImplClass.getClassLoader(), serviceImplClass, method, actionid, paramTypes, paramClasses); + RedkaleClassLoader.getRedkaleClassLoader(), + serviceImplClass, + method, + actionid, + paramTypes, + paramClasses); this.paramComposeBeanType = pt; this.paramComposeBeanCreator = (pt == null || pt == paramTypes[0]) ? null : Creator.load(TypeToken.typeToClass(pt), 1); @@ -242,7 +249,7 @@ public final class SncpRemoteAction { } public static Type createParamComposeBeanType( - ClassLoader loader, + RedkaleClassLoader loader, Class resourceType, Method method, Uint128 actionid, @@ -251,17 +258,17 @@ public final class SncpRemoteAction { if (paramTypes == null || paramTypes.length == 0) { return null; } - if (paramTypes.length == 1 && ProtobufFactory.root().createEncoder(paramTypes[0]) instanceof ObjectEncoder) { - return paramTypes[0]; + if (paramTypes.length == 1) { + Encodeable encodeable = ProtobufFactory.root().findEncoder(paramTypes[0]); + if (encodeable == null) { // java.io.Serializable会预置,直接调用createEncoder会提示不支持的Type + ProtobufFactory.root().createEncoder(paramTypes[0]); + } + if (encodeable instanceof ObjectEncoder || encodeable instanceof SimpledCoder) { + return paramTypes[0]; + } } // 动态生成组合JavaBean类 - if (loader == null) { - loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != resourceType.getClassLoader()) { - loader = resourceType.getClassLoader(); - } - } final String columnDesc = org.redkale.asm.Type.getDescriptor(ConvertColumn.class); final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionParamBean_" + resourceType.getSimpleName() + "_" + method.getName() + "_" + actionid; @@ -320,11 +327,7 @@ public final class SncpRemoteAction { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); Creator.load(newClazz, 1); // 只一个Object[]参数 diff --git a/src/main/java/org/redkale/net/sncp/SncpResponse.java b/src/main/java/org/redkale/net/sncp/SncpResponse.java index 80df56f9f..1f8ab4b79 100644 --- a/src/main/java/org/redkale/net/sncp/SncpResponse.java +++ b/src/main/java/org/redkale/net/sncp/SncpResponse.java @@ -41,7 +41,7 @@ public class SncpResponse extends Response { protected final CompletionHandler realHandler = new CompletionHandler() { @Override public void completed(Object result, Object attachment) { - finish(paramHandlerResultType, result); + finish(paramHandlerType, result); } @Override @@ -50,7 +50,7 @@ public class SncpResponse extends Response { } }; - protected Type paramHandlerResultType; + protected Type paramHandlerType; protected CompletionHandler paramAsyncHandler; @@ -80,11 +80,11 @@ public class SncpResponse extends Response { } public SncpResponse paramAsyncHandler( - Class paramHandlerType, Type paramHandlerResultType) { - this.paramHandlerResultType = paramHandlerResultType; - this.paramAsyncHandler = paramHandlerType == CompletionHandler.class + Class paramHandlerClass, Type paramHandlerType) { + this.paramHandlerType = paramHandlerType; + this.paramAsyncHandler = paramHandlerClass == CompletionHandler.class ? realHandler - : SncpAsyncHandler.createHandler(paramHandlerType, realHandler); + : SncpAsyncHandler.createHandler(paramHandlerClass, realHandler); return this; } @@ -101,7 +101,7 @@ public class SncpResponse extends Response { @Override protected boolean recycle() { writer.clear(); - this.paramHandlerResultType = null; + this.paramHandlerType = null; this.paramAsyncHandler = null; return super.recycle(); } diff --git a/src/main/java/org/redkale/source/EntityFullFunc.java b/src/main/java/org/redkale/source/EntityFullFunc.java index acb477cfc..ad6ce5c40 100644 --- a/src/main/java/org/redkale/source/EntityFullFunc.java +++ b/src/main/java/org/redkale/source/EntityFullFunc.java @@ -80,10 +80,7 @@ public abstract class EntityFullFunc { final String objectDesc = Type.getDescriptor(Object.class); final String serisDesc = Type.getDescriptor(Serializable[].class); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != entityType.getClassLoader()) { - loader = entityType.getClassLoader(); - } + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/source/_Dyn" + EntityFullFunc.class.getSimpleName() + "__" + entityType.getName().replace('.', '_').replace('$', '_'); try { @@ -796,12 +793,7 @@ public abstract class EntityFullFunc { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = (Class) - new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java index 6e08066d4..7d6aa8655 100644 --- a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java +++ b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java @@ -60,7 +60,7 @@ public final class DataSqlMapperBuilder { if (!mapperType.isInterface()) { throw new SourceException(mapperType + " is not interface"); } - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final Class entityType = entityType(mapperType); final String supDynName = mapperType.getName().replace('.', '/'); final String newDynName = "org/redkaledyn/source/mapper/_DynDataSqlMapper_" @@ -363,11 +363,7 @@ public final class DataSqlMapperBuilder { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionPublicConstructors(newClazz, newDynName.replace('/', '.')); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); diff --git a/src/main/java/org/redkale/util/Attribute.java b/src/main/java/org/redkale/util/Attribute.java index 7f16a2943..61eda0ed0 100644 --- a/src/main/java/org/redkale/util/Attribute.java +++ b/src/main/java/org/redkale/util/Attribute.java @@ -1002,11 +1002,11 @@ public interface Attribute { final String interDesc = Type.getDescriptor(TypeToken.typeToClass(subclass)); final String columnDesc = Type.getDescriptor(column); Class realclz = TypeToken.typeToClass(subclass); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); try { loader.loadClass(realclz.getName()); } catch (ClassNotFoundException e) { - loader = realclz.getClassLoader(); + // do nothing } String pkgname = ""; String clzname = newsubname.toString(); @@ -1233,12 +1233,7 @@ public interface Attribute { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = (Class) - new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/util/Copier.java b/src/main/java/org/redkale/util/Copier.java index 91d7eab22..3f651d4f7 100644 --- a/src/main/java/org/redkale/util/Copier.java +++ b/src/main/java/org/redkale/util/Copier.java @@ -679,7 +679,7 @@ public interface Copier extends BiFunction { final String srcClassName = srcClass.getName().replace('.', '/'); final String destDesc = Type.getDescriptor(destClass); final String srcDesc = Type.getDescriptor(srcClass); - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String utilClassName = Utility.class.getName().replace('.', '/'); final String newDynName = "org/redkaledyn/copier/_Dyn" + Copier.class.getSimpleName() + "_" + options + "__" + srcClass.getName().replace('.', '_').replace('$', '_') @@ -1337,11 +1337,7 @@ public interface Copier extends BiFunction { cw.visitEnd(); // ------------------------------------------------------------------------------ byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/util/Creator.java b/src/main/java/org/redkale/util/Creator.java index 975196bbe..ece849d65 100644 --- a/src/main/java/org/redkale/util/Creator.java +++ b/src/main/java/org/redkale/util/Creator.java @@ -292,10 +292,8 @@ public interface Creator { final String supDynName = Creator.class.getName().replace('.', '/'); final String interName = clazz.getName().replace('.', '/'); final String interDesc = Type.getDescriptor(clazz); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (String.class.getClassLoader() != clazz.getClassLoader()) { - loader = clazz.getClassLoader(); - } + RedkaleClassLoader loader = + RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/creator/_Dyn" + Creator.class.getSimpleName() + "__" + clazz.getName().replace('.', '_').replace('$', '_') + (paramCount < 0 ? "" : ("_" + paramCount)); try { @@ -571,11 +569,7 @@ public interface Creator { byte[] bytes = cw.toByteArray(); try { - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); return (Creator) newClazz.getDeclaredConstructor().newInstance(); diff --git a/src/main/java/org/redkale/util/Inners.java b/src/main/java/org/redkale/util/Inners.java index be93361f1..546b3eef6 100644 --- a/src/main/java/org/redkale/util/Inners.java +++ b/src/main/java/org/redkale/util/Inners.java @@ -231,7 +231,7 @@ class Inners { } final String interName = clazz.getName().replace('.', '/'); final String interDesc = org.redkale.asm.Type.getDescriptor(clazz); - final ClassLoader loader = clazz.getClassLoader(); + final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/creator/_DynArrayFunction__" + clazz.getName().replace('.', '_').replace('$', '_'); try { @@ -283,11 +283,7 @@ class Inners { cw.visitEnd(); final byte[] bytes = cw.toByteArray(); try { - Class resultClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class resultClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, resultClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(resultClazz, newDynName.replace('/', '.')); return (IntFunction) resultClazz.getDeclaredConstructor().newInstance(); diff --git a/src/main/java/org/redkale/util/Invoker.java b/src/main/java/org/redkale/util/Invoker.java index 5a4ca3ec5..2b9bee0fd 100644 --- a/src/main/java/org/redkale/util/Invoker.java +++ b/src/main/java/org/redkale/util/Invoker.java @@ -5,11 +5,10 @@ */ package org.redkale.util; -import static org.redkale.asm.Opcodes.*; - import java.lang.reflect.*; import java.util.concurrent.ConcurrentHashMap; import org.redkale.asm.*; +import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; /** @@ -92,7 +91,7 @@ public interface Invoker { } else if (returnType == void.class) { returnDesc = Type.getDescriptor(Void.class); } - ClassLoader loader = Thread.currentThread().getContextClassLoader(); + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); StringBuilder sbpts = new StringBuilder(); for (Class c : method.getParameterTypes()) { sbpts.append('_').append(c.getName().replace('.', '_').replace('$', '_')); @@ -209,11 +208,7 @@ public interface Invoker { Class resultClazz = null; try { if (resultClazz == null) { - resultClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + resultClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); } RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, resultClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(resultClazz, newDynName.replace('/', '.')); diff --git a/src/main/java/org/redkale/util/RedkaleClassLoader.java b/src/main/java/org/redkale/util/RedkaleClassLoader.java index dea3f61cb..79324aa67 100644 --- a/src/main/java/org/redkale/util/RedkaleClassLoader.java +++ b/src/main/java/org/redkale/util/RedkaleClassLoader.java @@ -89,6 +89,26 @@ public class RedkaleClassLoader extends URLClassLoader { super(urls, parent); } + public static RedkaleClassLoader getRedkaleClassLoader(ClassLoader loader) { + if (loader == null) { + loader = Thread.currentThread().getContextClassLoader(); + } + if (loader instanceof RedkaleClassLoader) { + return (RedkaleClassLoader) loader; + } + ClassLoader c = loader; + while ((c = c.getParent()) != null) { + if (c instanceof RedkaleClassLoader) { + return (RedkaleClassLoader) c; + } + } + return new RedkaleClassLoader(loader); + } + + public static RedkaleClassLoader getRedkaleClassLoader() { + return getRedkaleClassLoader(Thread.currentThread().getContextClassLoader()); + } + public static URI getConfResourceAsURI(String confURI, String file) { if (file.startsWith("http:") || file.startsWith("https:") || file.startsWith("ftp:")) { return URI.create(file); @@ -461,7 +481,20 @@ public class RedkaleClassLoader extends URLClassLoader { reflectionMap.forEach(action); } - public Class loadClass(String name, byte[] b) { + @Override + public Class findClass(String name) throws ClassNotFoundException { + byte[] classData = dynClassBytesMap.get(name); + if (classData == null) { + Class clazz = dynClassTypeMap.get(name); + if (clazz != null) { + return clazz; + } + return super.findClass(name); + } + return super.defineClass(name, classData, 0, classData.length); + } + + public Class loadClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } @@ -471,6 +504,10 @@ public class RedkaleClassLoader extends URLClassLoader { } } + public final void addDynClass(String name, byte[] bs) { + dynClassBytesMap.put(name, bs); + } + public void addURI(URI uri) { try { super.addURL(uri.toURL()); @@ -577,39 +614,4 @@ public class RedkaleClassLoader extends URLClassLoader { } } } - - public static class DynBytesClassLoader extends ClassLoader { - - private final Map classes = new HashMap<>(); - - public DynBytesClassLoader(ClassLoader parent) { - super(parent); - } - - public static DynBytesClassLoader create(ClassLoader parent) { - if (parent == null) { - parent = Thread.currentThread().getContextClassLoader(); - } - return parent instanceof DynBytesClassLoader - ? (DynBytesClassLoader) parent - : new DynBytesClassLoader(parent); - } - - @Override - public Class findClass(String name) throws ClassNotFoundException { - byte[] classData = classes.get(name); - if (classData == null) { - return super.findClass(name); - } - return super.defineClass(name, classData, 0, classData.length); - } - - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - - public final void addClass(String name, byte[] b) { - classes.put(name, b); - } - } } diff --git a/src/main/java/org/redkale/util/Reproduce.java b/src/main/java/org/redkale/util/Reproduce.java index 39e935a79..0972f06fe 100644 --- a/src/main/java/org/redkale/util/Reproduce.java +++ b/src/main/java/org/redkale/util/Reproduce.java @@ -1,12 +1,11 @@ package org.redkale.util; -import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; -import static org.redkale.asm.Opcodes.*; - import java.lang.reflect.Modifier; import java.util.Map; import java.util.function.*; import org.redkale.asm.*; +import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; +import static org.redkale.asm.Opcodes.*; /** * JavaBean类对象的拷贝,相同的字段名会被拷贝
@@ -68,7 +67,7 @@ public interface Reproduce extends BiFunction { final String srcClassName = srcClass.getName().replace('.', '/'); final String destDesc = Type.getDescriptor(destClass); final String srcDesc = Type.getDescriptor(srcClass); - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); final String newDynName = "org/redkaledyn/reproduce/_Dyn" + Reproduce.class.getSimpleName() + "__" + destClass.getName().replace('.', '_').replace('$', '_') + "__" + srcClass.getName().replace('.', '_').replace('$', '_'); @@ -232,11 +231,7 @@ public interface Reproduce extends BiFunction { cw.visitEnd(); // ------------------------------------------------------------------------------ byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); try { diff --git a/src/main/java/org/redkale/util/TypeToken.java b/src/main/java/org/redkale/util/TypeToken.java index f5543ce1f..a81cbdf62 100644 --- a/src/main/java/org/redkale/util/TypeToken.java +++ b/src/main/java/org/redkale/util/TypeToken.java @@ -662,7 +662,7 @@ public abstract class TypeToken { // 注意: RetResult[]> 这种泛型带[]的尚未实现支持 private static Type createParameterizedType0(final Class rawType, final Type... actualTypeArguments) { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); + RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader(); StringBuilder tmpps = new StringBuilder(getClassTypeDescriptor(rawType)); for (Type cz : actualTypeArguments) { tmpps.append(" ").append(getClassTypeDescriptor(cz)); @@ -715,11 +715,7 @@ public abstract class TypeToken { } cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(loader) { - public final Class loadClass(String name, byte[] b) { - return defineClass(name, b, 0, b.length); - } - }.loadClass(newDynName.replace('/', '.'), bytes); + Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionPublicFields(newDynName.replace('/', '.')); try { diff --git a/src/test/java/org/redkale/test/convert/ConvertCoderTest.java b/src/test/java/org/redkale/test/convert/ConvertCoderTest.java index f193329fa..1c638cab3 100644 --- a/src/test/java/org/redkale/test/convert/ConvertCoderTest.java +++ b/src/test/java/org/redkale/test/convert/ConvertCoderTest.java @@ -10,7 +10,7 @@ import java.util.*; import org.junit.jupiter.api.*; import org.redkale.convert.ConvertCoder; import org.redkale.convert.ConvertColumn; -import org.redkale.convert.ext.BigIntegerSimpledCoder.BigIntegerHexJsonSimpledCoder; +import org.redkale.convert.json.JsonCoders.BigIntegerHexJsonSimpledCoder; import org.redkale.convert.json.JsonConvert; import org.redkale.convert.pb.ProtobufConvert; diff --git a/src/test/java/org/redkale/test/convert/GenericEntityTest.java b/src/test/java/org/redkale/test/convert/GenericEntityTest.java index 417f528f0..d1bded3e7 100644 --- a/src/test/java/org/redkale/test/convert/GenericEntityTest.java +++ b/src/test/java/org/redkale/test/convert/GenericEntityTest.java @@ -17,6 +17,7 @@ import java.util.function.Supplier; import org.junit.jupiter.api.*; import org.redkale.convert.ConvertColumn; import org.redkale.convert.json.JsonConvert; +import org.redkale.convert.json.JsonFactory; import org.redkale.convert.pb.ProtobufConvert; import org.redkale.util.TypeToken; import org.redkale.util.Utility; @@ -43,6 +44,8 @@ public class GenericEntityTest { @Test public void runJson1() throws Exception { System.out.println("-------------------- runJson1 ---------------------------------"); + JsonFactory.root().loadEncoder(TreeNode.class); + JsonFactory.root().loadEncoder(TreeNode2.class); JsonConvert convert = JsonConvert.root(); GenericEntity bean = createBean(); String json = convert.convertTo(ENTITY_TYPE, bean); @@ -76,6 +79,8 @@ public class GenericEntityTest { @Test public void runPb1() throws Exception { System.out.println("-------------------- runPb1 ---------------------------------"); + JsonFactory.root().loadEncoder(TreeNode.class); + JsonFactory.root().loadEncoder(TreeNode2.class); ProtobufConvert convert = ProtobufConvert.root(); GenericEntity bean = createBean(); byte[] bs = convert.convertTo(ENTITY_TYPE, bean); @@ -137,6 +142,22 @@ public class GenericEntityTest { return bean; } + public static class TreeNode { + @ConvertColumn(index = 1) + public String name; + + @ConvertColumn(index = 2) + public TreeNode next; + } + + public static class TreeNode2 { + @ConvertColumn(index = 1) + public String name; + + @ConvertColumn(index = 2) + public List next; + } + public static class GenericEntity { @ConvertColumn(index = 1) diff --git a/src/test/java/org/redkale/test/convert/json/TinyTest.java b/src/test/java/org/redkale/test/convert/json/TinyTest.java index 5e0a2be33..66d2d7e40 100644 --- a/src/test/java/org/redkale/test/convert/json/TinyTest.java +++ b/src/test/java/org/redkale/test/convert/json/TinyTest.java @@ -53,4 +53,6 @@ public class TinyTest { public int id; } + + } diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepService.java b/src/test/java/org/redkale/test/sncp/SncpSleepService.java index bd17cfd62..017a7285c 100644 --- a/src/test/java/org/redkale/test/sncp/SncpSleepService.java +++ b/src/test/java/org/redkale/test/sncp/SncpSleepService.java @@ -50,7 +50,7 @@ public class SncpSleepService extends AbstractService { getExecutor()); } - public String test(Serializable id, String[] names, Collection files) { + public String test(Serializable id, String[] names, Collection files, int time) { return "ok"; } } diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java index 0ea1a2400..c2d717e53 100644 --- a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java +++ b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java @@ -65,7 +65,7 @@ public class SncpSleepTest { CompletableFuture.allOf(futures).join(); long e = System.currentTimeMillis() - s; System.out.println("耗时: " + e + " ms"); - remoteCService.test(333L, new String[] {"aaa", "bbb"}, List.of(new File("D:/a.txt"), new File("D:/b.txt"))); + remoteCService.test(333L, new String[] {"aaa", "bbb"}, List.of(new File("D:/a.txt"), new File("D:/b.txt")), 2); server.shutdown(); workExecutor.shutdown(); Assertions.assertTrue(e < 600); diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java index ebd222c8e..a667624f1 100644 --- a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java +++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java @@ -37,9 +37,9 @@ public class DynActionTestService_insert extends SncpActionServlet { Convert convert = request.getConvert(); Reader in = request.getReader(); DynSncpActionParamBean_TestService_insert bean = convert.convertFrom(paramComposeBeanType, in); - bean.arg0 = response.getParamAsyncHandler(); + bean.arg1 = response.getParamAsyncHandler(); TestService serviceObj = (TestService) service(); - serviceObj.insert(bean.arg0, bean.arg1, bean.arg2, bean.arg3); + serviceObj.insert(bean.arg1, bean.arg2, bean.arg3, bean.arg4); response.finishVoid(); } @@ -48,22 +48,22 @@ public class DynActionTestService_insert extends SncpActionServlet { public DynSncpActionParamBean_TestService_insert() {} public DynSncpActionParamBean_TestService_insert(Object[] params) { - this.arg0 = (BooleanHandler) params[0]; - this.arg1 = (TestBean) params[1]; - this.arg2 = (String) params[2]; - this.arg3 = (int) params[3]; + this.arg1 = (BooleanHandler) params[0]; + this.arg2 = (TestBean) params[1]; + this.arg3 = (String) params[2]; + this.arg4 = (int) params[3]; } @ConvertColumn(index = 1) - public BooleanHandler arg0; + public BooleanHandler arg1; @ConvertColumn(index = 2) - public TestBean arg1; + public TestBean arg2; @ConvertColumn(index = 3) - public String arg2; + public String arg3; @ConvertColumn(index = 4) - public int arg3; + public int arg4; } }