From 1dc07638e54ab75956c29f4850db323dd791ca49 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 11 Oct 2024 01:04:57 +0800 Subject: [PATCH] sncp --- .../redkale/convert/json/JsonDynEncoder.java | 5 +++- .../redkale/convert/pb/ProtobufCoders.java | 23 ++++++++++++++++ .../convert/pb/ProtobufDynEncoder.java | 5 +++- .../redkale/convert/pb/ProtobufFactory.java | 2 ++ .../redkale/net/sncp/SncpActionServlet.java | 16 ++++++----- .../redkale/net/sncp/SncpRemoteAction.java | 27 ++++++++++++------- 6 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java index 9911e64bb..483b8291f 100644 --- a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java +++ b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java @@ -66,7 +66,10 @@ public abstract class JsonDynEncoder extends ObjectEncoder { } } final Map mixedNames = mixedNames0; - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + if (String.class.getClassLoader() != clazz.getClassLoader()) { + loader = clazz.getClassLoader(); + } final String newDynName = "org/redkaledyn/convert/json/_Dyn" + JsonDynEncoder.class.getSimpleName() + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_" + Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java index cf31fc3ab..4bf978cd4 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java @@ -4,6 +4,7 @@ */ package org.redkale.convert.pb; +import java.io.File; import java.io.Serializable; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -260,6 +261,28 @@ public abstract class ProtobufCoders { } // ------------------------------------- simple object ------------------------------------- + + public static class ProtobufFileSimpledCoder extends FileSimpledCoder + implements ProtobufEncodeable { + + public static final ProtobufFileSimpledCoder instance = new ProtobufFileSimpledCoder(); + + @Override + public int computeSize(ProtobufWriter out, int tagSize, File value) { + if (value == null) { + return 0; + } + String val = value.getPath(); + int len = Utility.encodeUTF8Length(val); + return len + ProtobufFactory.computeSInt32SizeNoTag(len); + } + + @Override + public Type getType() { + return File.class; + } + } + public static class ProtobufNumberSimpledCoder extends NumberSimpledCoder implements ProtobufPrimitivable, ProtobufEncodeable { diff --git a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java index 388432cdc..c88df20cd 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java @@ -68,7 +68,10 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { } } - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + if (String.class.getClassLoader() != clazz.getClassLoader()) { + loader = clazz.getClassLoader(); + } final String newDynName = "org/redkaledyn/convert/pb/_Dyn" + ProtobufDynEncoder.class.getSimpleName() + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_" + Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert diff --git a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java index 5ef0ad2b9..741d8d95b 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -5,6 +5,7 @@ */ package org.redkale.convert.pb; +import java.io.File; import java.io.Serializable; import java.lang.reflect.*; import java.math.BigDecimal; @@ -85,6 +86,7 @@ public class ProtobufFactory extends ConvertFactory newClazz = null; try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); - newClazz = clz == null - ? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')) - : clz; + newClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz; } catch (Throwable ex) { // do nothing } @@ -373,7 +375,7 @@ public abstract class SncpActionServlet extends SncpServlet { final Class[] paramClasses = method.getParameterTypes(); java.lang.reflect.Type paramComposeBeanType0 = SncpRemoteAction.createParamComposeBeanType( - serviceImplClass, method, actionid, originalParamTypes, paramClasses); + loader, serviceImplClass, method, actionid, originalParamTypes, paramClasses); if (paramComposeBeanType0 != null && paramComposeBeanType0 == originalParamTypes[0]) { paramComposeBeanType0 = null; } @@ -621,7 +623,7 @@ public abstract class SncpActionServlet extends SncpServlet { paramComposeBeanClass.getName().replace('.', '/'); mv.visitVarInsn(ALOAD, 3); // convert mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, "paramComposeType", reflectTypeDesc); + mv.visitFieldInsn(GETFIELD, newDynName, "paramComposeBeanType", reflectTypeDesc); mv.visitVarInsn(ALOAD, 4); // reader mv.visitMethodInsn(INVOKEVIRTUAL, convertName, "convertFrom", convertFromDesc, false); mv.visitTypeInsn(CHECKCAST, paramComposeBeanName); @@ -711,7 +713,7 @@ public abstract class SncpActionServlet extends SncpServlet { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - newClazz = new ClassLoader(serviceClass.getClassLoader()) { + newClazz = new ClassLoader(loader) { public final Class loadClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } diff --git a/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java b/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java index f05346da7..adcb313cd 100644 --- a/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java +++ b/src/main/java/org/redkale/net/sncp/SncpRemoteAction.java @@ -98,10 +98,11 @@ public final class SncpRemoteAction { this.returnObjectType = rt == void.class || rt == Void.class ? null : rt; this.paramTypes = TypeToken.getGenericType(method.getGenericParameterTypes(), serviceImplClass); this.paramClasses = method.getParameterTypes(); - Type pt = createParamComposeBeanType(serviceImplClass, method, actionid, paramTypes, paramClasses); + Type pt = createParamComposeBeanType( + serviceImplClass.getClassLoader(), serviceImplClass, method, actionid, paramTypes, paramClasses); this.paramComposeBeanType = pt; this.paramComposeBeanCreator = - (pt == null || pt == paramTypes[0]) ? null : Creator.create(TypeToken.typeToClass(pt), 1); + (pt == null || pt == paramTypes[0]) ? null : Creator.load(TypeToken.typeToClass(pt), 1); this.method = method; Annotation[][] anns = method.getParameterAnnotations(); int topicAddrIndex = -1; @@ -241,7 +242,12 @@ public final class SncpRemoteAction { } public static Type createParamComposeBeanType( - Class resourceType, Method method, Uint128 actionid, Type[] paramTypes, Class[] paramClasses) { + ClassLoader loader, + Class resourceType, + Method method, + Uint128 actionid, + Type[] paramTypes, + Class[] paramClasses) { if (paramTypes == null || paramTypes.length == 0) { return null; } @@ -250,15 +256,18 @@ public final class SncpRemoteAction { } // 动态生成组合JavaBean类 - final Class serviceClass = resourceType.getClass(); + 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; 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; return newClazz; } catch (Throwable ex) { // do nothing @@ -311,14 +320,14 @@ public final class SncpRemoteAction { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newClazz = new ClassLoader(Thread.currentThread().getContextClassLoader()) { + Class newClazz = new ClassLoader(loader) { public final Class loadClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } }.loadClass(newDynName.replace('/', '.'), bytes); RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); - Creator.load(newClazz); + Creator.load(newClazz, 1); // 只一个Object[]参数 ProtobufFactory.root().loadDecoder(newClazz); ProtobufFactory.root().loadEncoder(newClazz); return newClazz;