From f694b617cfed0b020aa7686b8ba33d1a500483d9 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 13 Aug 2024 02:34:25 +0800 Subject: [PATCH] =?UTF-8?q?MessageAsmMethodBoost=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/boot/NodeWebSocketNodeLoader.java | 2 +- .../org/redkale/convert/ConvertFactory.java | 4 +- .../redkale/convert/ext/EnumSimpledCoder.java | 2 +- .../org/redkale/mq/spi/DynForMessaged.java | 4 +- .../redkale/mq/spi/MessageAsmMethodBoost.java | 46 +++++++++- .../org/redkale/util/RedkaleClassLoader.java | 88 +++++++++---------- 6 files changed, 94 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/redkale/boot/NodeWebSocketNodeLoader.java b/src/main/java/org/redkale/boot/NodeWebSocketNodeLoader.java index e8eebc919..156aecbc5 100644 --- a/src/main/java/org/redkale/boot/NodeWebSocketNodeLoader.java +++ b/src/main/java/org/redkale/boot/NodeWebSocketNodeLoader.java @@ -166,7 +166,7 @@ class NodeWebSocketNodeLoader implements ResourceTypeLoader { MessageAgent messageAgent = null; try { Field c = WebSocketServlet.class.getDeclaredField("messageAgent"); - RedkaleClassLoader.putReflectionField("messageAgent", c); + RedkaleClassLoader.putReflectionField(WebSocketServlet.class.getName(), c); c.setAccessible(true); messageAgent = (MessageAgent) c.get(srcObj); } catch (Exception ex) { diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index 6adcf2797..73744d05c 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -766,7 +766,7 @@ public abstract class ConvertFactory { try { Field instanceField = enClazz.getField("instance"); if (instanceField.getType() == enClazz && Modifier.isStatic(instanceField.getModifiers())) { - RedkaleClassLoader.putReflectionField("instance", instanceField); + RedkaleClassLoader.putReflectionField(enClazz.getName(), instanceField); encoder = (Encodeable) instanceField.get(null); } } catch (Exception e) { @@ -842,7 +842,7 @@ public abstract class ConvertFactory { try { Field instanceField = deClazz.getField("instance"); if (instanceField.getType() == deClazz && Modifier.isStatic(instanceField.getModifiers())) { - RedkaleClassLoader.putReflectionField("instance", instanceField); + RedkaleClassLoader.putReflectionField(deClazz.getName(), instanceField); decoder = (Decodeable) instanceField.get(null); } } catch (Exception e) { diff --git a/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java b/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java index 6dd134d5e..fcc8b2da3 100644 --- a/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java @@ -39,7 +39,7 @@ public final class EnumSimpledCoder value(); + String dynField(); + + Class consumer(); @Inherited @Documented diff --git a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java index 58533e28e..60bd6b771 100644 --- a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java +++ b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java @@ -4,6 +4,7 @@ package org.redkale.mq.spi; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -335,24 +336,58 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { String clzName = innerFullName.replace('/', '.'); Class clazz = classLoader.loadClass(clzName, bytes); RedkaleClassLoader.putDynClass(clzName, bytes, clazz); + RedkaleClassLoader.putReflectionPublicConstructors(clazz, clzName); AnnotationVisitor av2 = av1.visitAnnotation(null, org.redkale.asm.Type.getDescriptor(DynForMessaged.class)); - av2.visit("value", org.redkale.asm.Type.getType("L" + innerFullName + ";")); + av2.visit("dynField", getFieldName(innerFullName)); + av2.visit("consumer", org.redkale.asm.Type.getType("L" + innerFullName + ";")); av2.visitEnd(); }); av1.visitEnd(); av0.visitEnd(); + String consumerDesc = org.redkale.asm.Type.getDescriptor(MessageConsumer.class); + consumerBytes.forEach((innerFullName, bytes) -> { + FieldVisitor fv = cw.visitField(ACC_PRIVATE, getFieldName(innerFullName), consumerDesc, null, null); + fv.visitEnd(); + }); } } + @Override + public void doConstructorMethod( + DynBytesClassLoader classLoader, + ClassWriter cw, + MethodVisitor mv, + String newDynName, + String fieldPrefix, + boolean remote) { + if (remote || Utility.isEmpty(consumerBytes)) { + return; + } + String consumerDesc = org.redkale.asm.Type.getDescriptor(MessageConsumer.class); + consumerBytes.forEach((innerFullName, bytes) -> { + mv.visitVarInsn(ALOAD, 0); + mv.visitTypeInsn(NEW, innerFullName); + mv.visitInsn(DUP); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, innerFullName, "", "(L" + newDynName + ";)V", false); + mv.visitFieldInsn(PUTFIELD, newDynName, getFieldName(innerFullName), consumerDesc); + }); + } + @Override public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) { DynForMessaged[] dyns = service.getClass().getAnnotationsByType(DynForMessaged.class); if (Utility.isNotEmpty(dyns)) { try { for (DynForMessaged item : dyns) { - Class clazz = item.value(); - MessageConsumer consumer = (MessageConsumer) clazz.getConstructors()[0].newInstance(service); + // Class clazz = item.value(); + // MessageConsumer consumer = (MessageConsumer) clazz.getConstructors()[0].newInstance(service); + String fieldName = item.dynField(); + Field field = service.getClass().getDeclaredField(fieldName); + RedkaleClassLoader.putReflectionField(service.getClass().getName(), field); + field.setAccessible(true); + MessageConsumer consumer = (MessageConsumer) field.get(service); messageEngine.addMessageConsumer(consumer); } } catch (Exception e) { @@ -360,4 +395,9 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { } } } + + private String getFieldName(String innerFullName) { + String simpleClassName = innerFullName.substring(innerFullName.lastIndexOf('$') + 1); + return "_dyn" + simpleClassName; + } } diff --git a/src/main/java/org/redkale/util/RedkaleClassLoader.java b/src/main/java/org/redkale/util/RedkaleClassLoader.java index faf46ee3c..86467991a 100644 --- a/src/main/java/org/redkale/util/RedkaleClassLoader.java +++ b/src/main/java/org/redkale/util/RedkaleClassLoader.java @@ -168,14 +168,14 @@ public class RedkaleClassLoader extends URLClassLoader { dynClassBytesMap.forEach(action); } - public static void putReflectionClass(String name) { + public static void putReflectionClass(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap<>(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } } finally { reflectionLock.unlock(); @@ -191,14 +191,14 @@ public class RedkaleClassLoader extends URLClassLoader { serviceLoaderMap.forEach(action); } - public static void putReflectionField(String name, Field field) { + public static void putReflectionField(String className, Field field) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } List> list = (List) map.get("fields"); if (list == null) { @@ -222,14 +222,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionMethod(String name, Method method) { + public static void putReflectionMethod(String className, Method method) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } List> list = (List) map.get("methods"); if (list == null) { @@ -259,14 +259,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionDeclaredConstructors(Class clazz, String name, Class... cts) { + public static void putReflectionDeclaredConstructors(Class clazz, String className, Class... cts) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allDeclaredConstructors", true); @@ -310,14 +310,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionPublicConstructors(Class clazz, String name) { + public static void putReflectionPublicConstructors(Class clazz, String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allPublicConstructors", true); @@ -356,14 +356,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionDeclaredMethods(String name) { + public static void putReflectionDeclaredMethods(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allDeclaredMethods", true); } finally { @@ -371,14 +371,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionPublicMethods(String name) { + public static void putReflectionPublicMethods(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allPublicMethods", true); } finally { @@ -386,14 +386,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionDeclaredFields(String name) { + public static void putReflectionDeclaredFields(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allDeclaredFields", true); } finally { @@ -401,14 +401,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionPublicFields(String name) { + public static void putReflectionPublicFields(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allPublicFields", true); } finally { @@ -416,14 +416,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionDeclaredClasses(String name) { + public static void putReflectionDeclaredClasses(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allDeclaredClasses", true); } finally { @@ -431,14 +431,14 @@ public class RedkaleClassLoader extends URLClassLoader { } } - public static void putReflectionPublicClasses(String name) { + public static void putReflectionPublicClasses(String className) { reflectionLock.lock(); try { - Map map = reflectionMap.get(name); + Map map = reflectionMap.get(className); if (map == null) { map = new LinkedHashMap(); - map.put("name", name); - reflectionMap.put(name, map); + map.put("name", className); + reflectionMap.put(className, map); } map.put("allPublicClasses", true); } finally {