This commit is contained in:
redkale
2024-10-11 22:37:07 +08:00
parent bb611413a5
commit a1c4fafa47
5 changed files with 106 additions and 15 deletions

View File

@@ -4057,7 +4057,6 @@ public final class Rest {
} }
cw2.visitEnd(); cw2.visitEnd();
byte[] bytes = cw2.toByteArray(); byte[] bytes = cw2.toByteArray();
classLoader.addDynClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes);
innerClassBytesMap.put((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes); innerClassBytesMap.put((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes);
} }
} // end for each } // end for each
@@ -4221,17 +4220,9 @@ public final class Rest {
cw.visitEnd(); cw.visitEnd();
byte[] bytes = cw.toByteArray(); byte[] bytes = cw.toByteArray();
classLoader.addDynClass(newDynName.replace('/', '.'), bytes);
try { try {
Class<?> newClazz = classLoader.loadClass(newDynName.replace('/', '.')); Class<?> newClazz = classLoader.loadClass(newDynName.replace('/', '.'), bytes, innerClassBytesMap);
innerClassBytesMap.forEach((n, bs) -> { innerClassBytesMap.forEach((n, bs) -> RedkaleClassLoader.putReflectionClass(n));
try {
classLoader.loadClass(n, bs);
RedkaleClassLoader.putReflectionClass(n);
} catch (Exception e) {
throw new RestException(e);
}
});
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.')); RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
for (java.lang.reflect.Type t : retvalTypes) { for (java.lang.reflect.Type t : retvalTypes) {
JsonFactory.root().loadEncoder(t); JsonFactory.root().loadEncoder(t);

View File

@@ -504,6 +504,19 @@ public class RedkaleClassLoader extends URLClassLoader {
return clz; return clz;
} }
public Class loadClass(String name, byte[] bs, Map<String, byte[]> 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 @Override
public Class loadClass(String name) throws ClassNotFoundException { public Class loadClass(String name) throws ClassNotFoundException {
Class clazz = allDynClassTypeMap.get(name); 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) { public void addURI(URI uri) {
try { try {
super.addURL(uri.toURL()); super.addURL(uri.toURL());

View File

@@ -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 + '}';
}
}

View File

@@ -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);
}
}

View File

@@ -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<Long, Object> {
@Override
protected CompletableFuture<String> onOpen(final HttpRequest request) {
return CompletableFuture.completedFuture("uuid001");
}
@Override
protected CompletableFuture<Long> 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);
}
}