diff --git a/src/main/java/org/redkale/net/http/Rest.java b/src/main/java/org/redkale/net/http/Rest.java index ae8c408da..6c0fdc4f8 100644 --- a/src/main/java/org/redkale/net/http/Rest.java +++ b/src/main/java/org/redkale/net/http/Rest.java @@ -4057,7 +4057,6 @@ public final class Rest { } cw2.visitEnd(); byte[] bytes = cw2.toByteArray(); - classLoader.addDynClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); innerClassBytesMap.put((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); } } // end for each @@ -4221,17 +4220,9 @@ public final class Rest { cw.visitEnd(); byte[] bytes = cw.toByteArray(); - classLoader.addDynClass(newDynName.replace('/', '.'), bytes); try { - Class newClazz = classLoader.loadClass(newDynName.replace('/', '.')); - innerClassBytesMap.forEach((n, bs) -> { - try { - classLoader.loadClass(n, bs); - RedkaleClassLoader.putReflectionClass(n); - } catch (Exception e) { - throw new RestException(e); - } - }); + Class newClazz = classLoader.loadClass(newDynName.replace('/', '.'), bytes, innerClassBytesMap); + innerClassBytesMap.forEach((n, bs) -> RedkaleClassLoader.putReflectionClass(n)); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); for (java.lang.reflect.Type t : retvalTypes) { JsonFactory.root().loadEncoder(t); diff --git a/src/main/java/org/redkale/util/RedkaleClassLoader.java b/src/main/java/org/redkale/util/RedkaleClassLoader.java index 3cf41b23c..ab6d55a10 100644 --- a/src/main/java/org/redkale/util/RedkaleClassLoader.java +++ b/src/main/java/org/redkale/util/RedkaleClassLoader.java @@ -504,6 +504,19 @@ public class RedkaleClassLoader extends URLClassLoader { return clz; } + public Class loadClass(String name, byte[] bs, Map innerClassMap) { + innerClassMap.forEach((k, v) -> { + dynClassBytesMap.put(k, v); + allDynClassBytesMap.put(k, v); + }); + Class clz = defineClass(name, bs, 0, bs.length); + dynClassTypeMap.put(name, clz); + dynClassBytesMap.put(name, bs); + allDynClassTypeMap.put(name, clz); + allDynClassBytesMap.put(name, bs); + return clz; + } + @Override public Class loadClass(String name) throws ClassNotFoundException { Class clazz = allDynClassTypeMap.get(name); @@ -532,10 +545,6 @@ 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()); diff --git a/src/test/java/org/redkale/test/websocket/dyn/GameRoomBean.java b/src/test/java/org/redkale/test/websocket/dyn/GameRoomBean.java new file mode 100644 index 000000000..7086befe5 --- /dev/null +++ b/src/test/java/org/redkale/test/websocket/dyn/GameRoomBean.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.test.websocket.dyn; + +import org.redkale.convert.ConvertColumn; + +/** + * + * @author zhangjx + */ +public class GameRoomBean { + @ConvertColumn(index = 1) + public int roomid; + + @ConvertColumn(index = 2) + public String roomName; + + @Override + public String toString() { + return "RoomBean{" + "roomid=" + roomid + ", roomName=" + roomName + '}'; + } +} diff --git a/src/test/java/org/redkale/test/websocket/dyn/GameTest.java b/src/test/java/org/redkale/test/websocket/dyn/GameTest.java new file mode 100644 index 000000000..3063165e7 --- /dev/null +++ b/src/test/java/org/redkale/test/websocket/dyn/GameTest.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.test.websocket.dyn; + +import org.junit.jupiter.api.Test; +import org.redkale.net.http.Rest; +import org.redkale.net.http.WebSocketServlet; +import org.redkale.util.RedkaleClassLoader; + +/** + * + * @author zhangjx + */ +public class GameTest { + + public static void main(String[] args) throws Throwable { + GameTest test = new GameTest(); + test.run(); + } + + @Test + public void run() throws Exception { + RedkaleClassLoader classLoader = RedkaleClassLoader.getRedkaleClassLoader(); + WebSocketServlet servlet = Rest.createRestWebSocketServlet(classLoader, GameWebSocket.class, null); + } +} diff --git a/src/test/java/org/redkale/test/websocket/dyn/GameWebSocket.java b/src/test/java/org/redkale/test/websocket/dyn/GameWebSocket.java new file mode 100644 index 000000000..9709f7d76 --- /dev/null +++ b/src/test/java/org/redkale/test/websocket/dyn/GameWebSocket.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.test.websocket.dyn; + +import java.util.concurrent.CompletableFuture; +import org.redkale.net.http.HttpRequest; +import org.redkale.net.http.RestOnMessage; +import org.redkale.net.http.RestWebSocket; +import org.redkale.net.http.WebSocket; + +/** + * + * @author zhangjx + */ +@RestWebSocket(name = "wstest", catalog = "ws", wsmaxconns = 100, comment = "WebSocket服务", repair = false) +public class GameWebSocket extends WebSocket { + + @Override + protected CompletableFuture onOpen(final HttpRequest request) { + return CompletableFuture.completedFuture("uuid001"); + } + + @Override + protected CompletableFuture createUserid() { + return CompletableFuture.completedFuture(111222L); + } + + @RestOnMessage(name = "joinRoom", comment = "加入房间") + public void joinRoom(GameRoomBean bean) { + System.out.println("加入房间-参数: " + bean); + } + + @RestOnMessage(name = "enterGame", comment = "加入游戏") + public void enterGame(String game, long time) { + System.out.println("加入游戏-参数: " + game + ", " + time); + } +}