From c0f8cdf90232ec69e55c2b60ae8a02ae2fdbf724 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Tue, 6 Jun 2017 09:30:46 +0800 Subject: [PATCH] --- src/org/redkale/boot/Application.java | 2 +- src/org/redkale/boot/ClassFilter.java | 15 ++++++---- src/org/redkale/boot/NodeHttpServer.java | 11 +++---- src/org/redkale/boot/NodeServer.java | 21 +++++++------- src/org/redkale/convert/ConvertFactory.java | 2 +- .../redkale/convert/ext/TypeSimpledCoder.java | 2 +- .../redkale/net/http/HttpPrepareServlet.java | 2 +- src/org/redkale/net/http/HttpServer.java | 15 ++++++---- src/org/redkale/net/http/HttpServlet.java | 2 +- src/org/redkale/net/http/Rest.java | 8 ++--- src/org/redkale/net/sncp/Sncp.java | 29 +++++++++++-------- src/org/redkale/net/sncp/SncpDynServlet.java | 2 +- src/org/redkale/source/CacheMemorySource.java | 4 +-- src/org/redkale/source/DataSources.java | 2 +- src/org/redkale/source/PoolJdbcSource.java | 6 ++-- src/org/redkale/util/Attribute.java | 4 +-- src/org/redkale/util/Creator.java | 4 +-- src/org/redkale/util/Reproduce.java | 4 +-- src/org/redkale/util/TypeToken.java | 4 +-- 19 files changed, 76 insertions(+), 63 deletions(-) diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index f5704f7b7..a13f902f1 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -617,7 +617,7 @@ public final class Application { if (!inited.get()) { synchronized (nodeClasses) { if (!inited.getAndSet(true)) { //加载自定义的协议,如:SOCKS - ClassFilter profilter = new ClassFilter(NodeProtocol.class, NodeServer.class, (Class[]) null); + ClassFilter profilter = new ClassFilter(classLoader, NodeProtocol.class, NodeServer.class, (Class[]) null); ClassFilter.Loader.load(home, serconf.getValue("excludelibs", "").split(";"), profilter); final Set> entrys = profilter.getFilterEntrys(); for (FilterEntry entry : entrys) { diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index 87ed88fc4..4c8b087b8 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -58,19 +58,22 @@ public final class ClassFilter { private AnyValue conf; //基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。 - public ClassFilter(Class annotationClass, Class superClass, Class[] excludeSuperClasses) { - this(annotationClass, superClass, excludeSuperClasses, null); + private final ClassLoader classLoader; + + public ClassFilter(ClassLoader classLoader, Class annotationClass, Class superClass, Class[] excludeSuperClasses) { + this(classLoader, annotationClass, superClass, excludeSuperClasses, null); } - public ClassFilter(Class annotationClass, Class superClass, Class[] excludeSuperClasses, AnyValue conf) { + public ClassFilter(ClassLoader classLoader, Class annotationClass, Class superClass, Class[] excludeSuperClasses, AnyValue conf) { this.annotationClass = annotationClass; this.superClass = superClass; this.excludeSuperClasses = excludeSuperClasses; this.conf = conf; + this.classLoader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader; } public static ClassFilter create(Class[] excludeSuperClasses, String includeregs, String excluderegs, Set includeValues, Set excludeValues) { - ClassFilter filter = new ClassFilter(null, null, excludeSuperClasses); + ClassFilter filter = new ClassFilter(null, null, null, excludeSuperClasses); filter.setIncludePatterns(includeregs == null ? null : includeregs.split(";")); filter.setExcludePatterns(excluderegs == null ? null : excluderegs.split(";")); filter.setPrivilegeIncludes(includeValues); @@ -156,7 +159,7 @@ public final class ClassFilter { } if (cf == null || clazzname.startsWith("sun.")) return; try { - Class clazz = Class.forName(clazzname); + Class clazz = classLoader.loadClass(clazzname); if (!cf.accept(property, clazz, autoscan)) return; if (cf.conf != null) { if (property == null) { @@ -180,7 +183,7 @@ public final class ClassFilter { } catch (Throwable cfe) { if (finer && !clazzname.startsWith("sun.") && !clazzname.startsWith("javax.") && !clazzname.startsWith("com.sun.") && !clazzname.startsWith("jdk.")) { - //logger.log(Level.FINEST, ClassFilter.class.getSimpleName() + " filter error", cfe); + logger.log(Level.FINEST, ClassFilter.class.getSimpleName() + " filter error", cfe); } } } diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 7863d7ea8..cad69b976 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -109,7 +109,7 @@ public class NodeHttpServer extends NodeServer { synchronized (regFactory) { Service nodeService = (Service) rf.find(resourceName, WebSocketNode.class); if (nodeService == null) { - nodeService = Sncp.createLocalService(resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set) null, (AnyValue) null); + nodeService = Sncp.createLocalService(classLoader, resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set) null, (AnyValue) null); regFactory.register(resourceName, WebSocketNode.class, nodeService); } resourceFactory.inject(nodeService, self); @@ -210,8 +210,9 @@ public class NodeHttpServer extends NodeServer { final boolean autoload = restConf.getBoolValue("autoload", true); { //加载RestService String userTypeStr = restConf.getValue("usertype"); - final Class userType = userTypeStr == null ? null : Class.forName(userTypeStr); - final Class baseServletType = Class.forName(restConf.getValue("base", HttpServlet.class.getName())); + final Class userType = userTypeStr == null ? null : this.classLoader.loadClass(userTypeStr); + + final Class baseServletType = this.classLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName())); final Set includeValues = new HashSet<>(); final Set excludeValues = new HashSet<>(); for (AnyValue item : restConf.getAnyValues("service")) { @@ -238,7 +239,7 @@ public class NodeHttpServer extends NodeServer { return; } restedObjects.add(service); //避免重复创建Rest对象 - HttpServlet servlet = httpServer.addRestServlet(service, userType, baseServletType, prefix); + HttpServlet servlet = httpServer.addRestServlet(classLoader, service, userType, baseServletType, prefix); if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null resourceFactory.inject(servlet, NodeHttpServer.this); if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet); @@ -288,7 +289,7 @@ public class NodeHttpServer extends NodeServer { return; } restedObjects.add(stype); //避免重复创建Rest对象 - HttpServlet servlet = httpServer.addRestWebSocketServlet(stype, prefix, en.getProperty()); + HttpServlet servlet = httpServer.addRestWebSocketServlet(classLoader, stype, prefix, en.getProperty()); if (servlet == null) return; //没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null resourceFactory.inject(servlet, NodeHttpServer.this); if (finest) logger.finest(threadName + " " + stype.getName() + " create RestWebSocketServlet " + servlet); diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 307bb233b..847694a88 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -131,7 +131,8 @@ public abstract class NodeServer { resourceFactory.register(Server.RESNAME_SERVER_ROOT, Path.class, myroot.toPath()); //加入指定的classpath - Server.loadLib(classLoader, logger, (isWATCH() ? "${APP_HOME}/lib/*;" : "") + this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath())); + Server.loadLib(classLoader, logger, this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath().replace('\\', '/'))); + Thread.currentThread().setContextClassLoader(this.classLoader); } //必须要进行初始化, 构建Service时需要使用Context中的ExecutorService server.init(this.serverConf); @@ -139,7 +140,7 @@ public abstract class NodeServer { initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。 String interceptorClass = this.serverConf.getValue("interceptor", ""); if (!interceptorClass.isEmpty()) { - Class clazz = Class.forName(interceptorClass); + Class clazz = classLoader.loadClass(interceptorClass); this.interceptor = (NodeInterceptor) clazz.newInstance(); } @@ -173,7 +174,7 @@ public abstract class NodeServer { if (resources != null) { for (AnyValue sourceConf : resources.getAnyValues("source")) { try { - Class type = Class.forName(sourceConf.getValue("value")); + Class type = classLoader.loadClass(sourceConf.getValue("value")); if (!Service.class.isAssignableFrom(type)) { logger.log(Level.SEVERE, "load application source resource, but not Service error: " + sourceConf); } else if (CacheSource.class.isAssignableFrom(type)) { @@ -229,7 +230,7 @@ public abstract class NodeServer { final Set groups = new HashSet<>(); if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup()); if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups()); - Service cacheListenerService = Sncp.createLocalService(resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src)); + Service cacheListenerService = Sncp.createLocalService(classLoader, resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src)); appResFactory.register(resourceName, DataCacheListener.class, cacheListenerService); localServices.add(cacheListenerService); sncpServer.consumerAccept(cacheListenerService); @@ -255,11 +256,11 @@ public abstract class NodeServer { SncpClient client = Sncp.getSncpClient(srcService); final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress(); final AnyValue sourceConf = cacheResource.get(resourceName); - final Class sourceType = sourceConf == null ? CacheMemorySource.class : Class.forName(sourceConf.getValue("type")); + final Class sourceType = sourceConf == null ? CacheMemorySource.class : classLoader.loadClass(sourceConf.getValue("type")); final Set groups = new HashSet<>(); if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup()); if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups()); - final CacheSource source = (CacheSource) Sncp.createLocalService(resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService)); + final CacheSource source = (CacheSource) Sncp.createLocalService(classLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService)); Type genericType = field.getGenericType(); ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null; Type valType = pt == null ? null : pt.getActualTypeArguments()[1]; @@ -330,9 +331,9 @@ public abstract class NodeServer { Service service; boolean ws = src instanceof WebSocketServlet; if (ws || localed) { //本地模式 - service = Sncp.createLocalService(resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); + service = Sncp.createLocalService(classLoader, resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); } else { - service = Sncp.createRemoteService(resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); + service = Sncp.createRemoteService(classLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); } if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService @@ -436,7 +437,7 @@ public abstract class NodeServer { protected ClassFilter createClassFilter(final String localGroup, Class ref, Class inter, Class[] excludeSuperClasses, Class ref2, String properties, String property) { - ClassFilter cf = new ClassFilter(ref, inter, excludeSuperClasses, null); + ClassFilter cf = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, null); if (properties == null && properties == null) { cf.setRefused(true); return cf; @@ -463,7 +464,7 @@ public abstract class NodeServer { prop = new AnyValue.DefaultAnyValue(); prop.addValue("groups", sc); } - ClassFilter filter = new ClassFilter(ref, inter, excludeSuperClasses, prop); + ClassFilter filter = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, prop); for (AnyValue av : list.getAnyValues(property)) { // 节点 final AnyValue[] items = av.getAnyValues("property"); if (av instanceof DefaultAnyValue && items.length > 0) { //存在 节点 diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index 3008897a1..3b4e67cc4 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -253,7 +253,7 @@ public abstract class ConvertFactory { Class clazz = findEntityAlias(name); try { - return clazz == null ? Class.forName(name) : clazz; + return clazz == null ? Thread.currentThread().getContextClassLoader().loadClass(name) : clazz; } catch (Exception ex) { throw new ConvertException("convert entity is " + name, ex); } diff --git a/src/org/redkale/convert/ext/TypeSimpledCoder.java b/src/org/redkale/convert/ext/TypeSimpledCoder.java index 094d585d1..70257d4ac 100644 --- a/src/org/redkale/convert/ext/TypeSimpledCoder.java +++ b/src/org/redkale/convert/ext/TypeSimpledCoder.java @@ -37,7 +37,7 @@ public class TypeSimpledCoder extends Simple String str = in.readSmallString(); if (str == null) return null; try { - return Class.forName(str); + return Thread.currentThread().getContextClassLoader().loadClass(str); } catch (Throwable e) { return null; } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 48dc0063e..4cb26b257 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -222,7 +222,7 @@ public class HttpPrepareServlet extends PrepareServlet WebSocket * @param HttpServlet + * @param classLoader ClassLoader * @param webSocketType WebSocket的类型 * @param prefix url前缀 * @param conf 配置信息 * * @return RestServlet */ - public T addRestWebSocketServlet(final Class webSocketType, final String prefix, final AnyValue conf) { - T servlet = Rest.createRestWebSocketServlet(webSocketType); + public T addRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType, final String prefix, final AnyValue conf) { + T servlet = Rest.createRestWebSocketServlet(classLoader, webSocketType); if (servlet != null) this.prepare.addServlet(servlet, prefix, conf); return servlet; } @@ -189,6 +190,7 @@ public class HttpServer extends Server Service * @param HttpServlet + * @param classLoader ClassLoader * @param service Service对象 * @param userType 用户数据类型 * @param baseServletType RestServlet基类 @@ -196,8 +198,8 @@ public class HttpServer extends Server T addRestServlet(final S service, final Class userType, final Class baseServletType, final String prefix) { - return addRestServlet(null, service, userType, baseServletType, prefix); + public T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class baseServletType, final String prefix) { + return addRestServlet(classLoader, null, service, userType, baseServletType, prefix); } /** @@ -205,6 +207,7 @@ public class HttpServer extends Server Service * @param HttpServlet + * @param classLoader ClassLoader * @param name 资源名 * @param service Service对象 * @param userType 用户数据类型 @@ -213,7 +216,7 @@ public class HttpServer extends Server T addRestServlet(final String name, final S service, final Class userType, final Class baseServletType, final String prefix) { + public T addRestServlet(final ClassLoader classLoader, final String name, final S service, final Class userType, final Class baseServletType, final String prefix) { T servlet = null; final boolean sncp = Sncp.isSncpDyn(service); final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name; @@ -233,7 +236,7 @@ public class HttpServer extends Server int i = 0; for (;;) { try { - Class.forName(newDynName.replace('/', '.')); + Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')); newDynName += "_" + (++i); } catch (Throwable ex) { break; diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index 0bd3cc973..11d5df3a3 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -158,7 +158,7 @@ public final class Rest { } } - static T createRestWebSocketServlet(final Class webSocketType) { + static T createRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType) { if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet"); if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet"); if (Modifier.isFinal(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot final on createRestWebSocketServlet"); @@ -178,6 +178,7 @@ public final class Rest { //---------------------------------------------------------------------------------------- final Set resourcesFieldSet = new LinkedHashSet<>(); + final ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader; Class clzz = webSocketType; do { for (Field field : webSocketType.getDeclaredFields()) { @@ -232,7 +233,6 @@ public final class Rest { final String newDynConsumerSimpleName = "_DynRestOnMessageConsumer"; final String newDynConsumerFullName = newDynName + "$" + newDynConsumerSimpleName; //---------------------------------------------------------------------------------------- - ClassLoader loader = Rest.class.getClassLoader(); ClassWriter cw = new ClassWriter(COMPUTE_FRAMES); FieldVisitor fv; @@ -530,7 +530,7 @@ public final class Rest { } } - static T createRestServlet(final Class userType0, final Class baseServletType, final Class serviceType) { + static T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class baseServletType, final Class serviceType) { if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet"); if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet"); int mod = baseServletType.getModifiers(); @@ -564,7 +564,7 @@ public final class Rest { final String supDynName = baseServletType.getName().replace('.', '/'); final RestService controller = serviceType.getAnnotation(RestService.class); if (controller != null && controller.ignore()) throw new RuntimeException(serviceType + " is ignore Rest Service Class"); //标记为ignore=true不创建Servlet - ClassLoader loader = Rest.class.getClassLoader(); + ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader; String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet"; //------------------------------------------------------------------------------ diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 72fdf7b95..9f64c1e37 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -256,13 +256,14 @@ public abstract class Sncp { * 创建Service的本地模式Class * * @param Service子类 + * @param classLoader ClassLoader * @param name 资源名 * @param serviceImplClass Service类 * * @return Service实例 */ @SuppressWarnings("unchecked") - protected static Class createLocalServiceClass(final String name, final Class serviceImplClass) { + protected static Class createLocalServiceClass(ClassLoader classLoader, final String name, final Class serviceImplClass) { if (serviceImplClass == null) return null; if (!Service.class.isAssignableFrom(serviceImplClass)) return serviceImplClass; int mod = serviceImplClass.getModifiers(); @@ -274,7 +275,7 @@ public abstract class Sncp { final String clientDesc = Type.getDescriptor(SncpClient.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); - ClassLoader loader = Sncp.class.getClassLoader(); + ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader; String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + LOCALPREFIX + serviceImplClass.getSimpleName(); if (!name.isEmpty()) { boolean normal = true; @@ -285,7 +286,7 @@ public abstract class Sncp { newDynName += "_" + (normal ? name : hash(name)); } try { - return (Class) Class.forName(newDynName.replace('/', '.')); + return (Class) loader.loadClass(newDynName.replace('/', '.')); } catch (Throwable ex) { } //------------------------------------------------------------------------------ @@ -738,7 +739,7 @@ public abstract class Sncp { public static T createSimpleLocalService(final Class serviceImplClass, final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) { - return createLocalService("", serviceImplClass, ResourceFactory.root(), transportFactory, clientSncpAddress, Utility.ofSet(groups), null); + return createLocalService(null, "", serviceImplClass, ResourceFactory.root(), transportFactory, clientSncpAddress, Utility.ofSet(groups), null); } /** @@ -746,6 +747,7 @@ public abstract class Sncp { * 创建本地模式Service实例 * * @param Service泛型 + * @param classLoader ClassLoader * @param name 资源名 * @param serviceImplClass Service类 * @param resourceFactory ResourceFactory @@ -758,6 +760,7 @@ public abstract class Sncp { */ @SuppressWarnings("unchecked") public static T createLocalService( + final ClassLoader classLoader, final String name, final Class serviceImplClass, final ResourceFactory resourceFactory, @@ -766,7 +769,7 @@ public abstract class Sncp { final Set groups, final AnyValue conf) { try { - final Class newClazz = createLocalServiceClass(name, serviceImplClass); + final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass); T rs = (T) newClazz.newInstance(); //-------------------------------------- Service remoteService = null; @@ -780,7 +783,7 @@ public abstract class Sncp { if (!field.getType().isAssignableFrom(newClazz)) continue; field.setAccessible(true); if (remoteService == null && clientSncpAddress != null) { - remoteService = createRemoteService(name, serviceImplClass, transportFactory, clientSncpAddress, groups, conf); + remoteService = createRemoteService(classLoader, name, serviceImplClass, transportFactory, clientSncpAddress, groups, conf); } if (remoteService != null) field.set(rs, remoteService); } @@ -821,7 +824,7 @@ public abstract class Sncp { public static T createSimpleRemoteService(final Class serviceImplClass, final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) { - return createRemoteService("", serviceImplClass, transportFactory, clientSncpAddress, Utility.ofSet(groups), null); + return createRemoteService(null, "", serviceImplClass, transportFactory, clientSncpAddress, Utility.ofSet(groups), null); } /** @@ -865,6 +868,7 @@ public abstract class Sncp { * 创建远程模式的Service实例 * * @param Service泛型 + * @param classLoader ClassLoader * @param name 资源名 * @param serviceTypeOrImplClass Service类 * @param transportFactory TransportFactory @@ -877,6 +881,7 @@ public abstract class Sncp { @SuppressWarnings("unchecked") public static T createRemoteService( + final ClassLoader classLoader, final String name, final Class serviceTypeOrImplClass, final TransportFactory transportFactory, @@ -893,12 +898,12 @@ public abstract class Sncp { final String clientDesc = Type.getDescriptor(SncpClient.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); - ClassLoader loader = Sncp.class.getClassLoader(); + ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader; String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceTypeOrImplClass.getSimpleName(); try { - Class newClazz = Class.forName(newDynName.replace('/', '.')); + Class newClazz = loader.loadClass(newDynName.replace('/', '.')); T rs = (T) newClazz.newInstance(); - SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); + SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); client.setRemoteGroups(groups); client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups)); Field c = newClazz.getDeclaredField(FIELDPREFIX + "_client"); @@ -987,7 +992,7 @@ public abstract class Sncp { mv.visitEnd(); } int i = -1; - for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass)) { + for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass)) { final int index = ++i; final java.lang.reflect.Method method = entry.method; { @@ -1091,7 +1096,7 @@ public abstract class Sncp { }.loadClass(newDynName.replace('/', '.'), bytes); try { T rs = (T) newClazz.newInstance(); - SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); + SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); client.setRemoteGroups(groups); client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups)); { diff --git a/src/org/redkale/net/sncp/SncpDynServlet.java b/src/org/redkale/net/sncp/SncpDynServlet.java index 85af9871b..df4e2593d 100644 --- a/src/org/redkale/net/sncp/SncpDynServlet.java +++ b/src/org/redkale/net/sncp/SncpDynServlet.java @@ -310,7 +310,7 @@ public final class SncpDynServlet extends SncpServlet { + "DynAction" + serviceClass.getSimpleName() + "_" + method.getName() + "_" + actionid; while (true) { try { - Class.forName(newDynName.replace('/', '.')); + Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.')); newDynName += "_"; } catch (Throwable ex) { break; diff --git a/src/org/redkale/source/CacheMemorySource.java b/src/org/redkale/source/CacheMemorySource.java index df3efe829..96acac159 100644 --- a/src/org/redkale/source/CacheMemorySource.java +++ b/src/org/redkale/source/CacheMemorySource.java @@ -84,7 +84,7 @@ public class CacheMemorySource extends String storeValueStr = prop.getValue("value-type"); if (storeKeyStr != null && storeValueStr != null) { try { - this.setStoreType(Class.forName(storeKeyStr), Class.forName(storeValueStr)); + this.setStoreType(Thread.currentThread().getContextClassLoader().loadClass(storeKeyStr), Thread.currentThread().getContextClassLoader().loadClass(storeValueStr)); } catch (Throwable e) { logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeKeyStr + ", " + storeValueStr + ") error", e); } @@ -94,7 +94,7 @@ public class CacheMemorySource extends String expireHandlerClass = prop == null ? null : prop.getValue("expirehandler"); if (expireHandlerClass != null) { try { - this.expireHandler = (Consumer) Class.forName(expireHandlerClass).newInstance(); + this.expireHandler = (Consumer) Thread.currentThread().getContextClassLoader().loadClass(expireHandlerClass).newInstance(); } catch (Throwable e) { logger.log(Level.SEVERE, self.getClass().getSimpleName() + " new expirehandler class (" + expireHandlerClass + ") instance error", e); } diff --git a/src/org/redkale/source/DataSources.java b/src/org/redkale/source/DataSources.java index bd6fbbfc7..f04b5d6c1 100644 --- a/src/org/redkale/source/DataSources.java +++ b/src/org/redkale/source/DataSources.java @@ -85,7 +85,7 @@ public final class DataSources { String impl = readprop.getProperty(JDBC_DATASOURCE_CLASS, DataJdbcSource.class.getName()); if (DataJdbcSource.class.getName().equals(impl)) return new DataJdbcSource(unitName, readprop, writeprop); try { - Class ds = Class.forName(impl); + Class ds = Thread.currentThread().getContextClassLoader().loadClass(impl); for (Constructor d : ds.getConstructors()) { Class[] paramtypes = d.getParameterTypes(); if (paramtypes.length == 1 && paramtypes[0] == Properties.class) { diff --git a/src/org/redkale/source/PoolJdbcSource.java b/src/org/redkale/source/PoolJdbcSource.java index 99a66a8da..c4c6dfba2 100644 --- a/src/org/redkale/source/PoolJdbcSource.java +++ b/src/org/redkale/source/PoolJdbcSource.java @@ -129,7 +129,7 @@ public class PoolJdbcSource { case "com.mysql.cj.jdbc.Driver": case "com.mysql.jdbc.Driver": try { - Class.forName("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"); + Thread.currentThread().getContextClassLoader().loadClass("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"); source = "com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"; } catch (Throwable e) { source = "com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"; @@ -146,10 +146,10 @@ public class PoolJdbcSource { break; } } - final Class clazz = Class.forName(source); + final Class clazz = Thread.currentThread().getContextClassLoader().loadClass(source); Object pdsource = clazz.newInstance(); if (source.contains(".postgresql.")) { - Class driver = Class.forName("org.postgresql.Driver"); + Class driver = Thread.currentThread().getContextClassLoader().loadClass("org.postgresql.Driver"); Properties properties = (Properties) driver.getMethod("parseURL", String.class, Properties.class).invoke(null, url, new Properties()); clazz.getMethod("setServerName", String.class).invoke(pdsource, properties.getProperty("PGHOST")); clazz.getMethod("setDatabaseName", String.class).invoke(pdsource, properties.getProperty("PGDBNAME")); diff --git a/src/org/redkale/util/Attribute.java b/src/org/redkale/util/Attribute.java index 150c4e0d3..f0cc4e40a 100644 --- a/src/org/redkale/util/Attribute.java +++ b/src/org/redkale/util/Attribute.java @@ -431,7 +431,7 @@ public interface Attribute { final String interDesc = Type.getDescriptor(clazz); final String columnDesc = Type.getDescriptor(column); - ClassLoader loader = Attribute.class.getClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); String newDynName = supDynName + "_Dyn_" + clazz.getSimpleName() + "_" + fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array"); if (String.class.getClassLoader() != clazz.getClassLoader()) { @@ -440,7 +440,7 @@ public interface Attribute { + fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array"); } try { - return (Attribute) Class.forName(newDynName.replace('/', '.')).newInstance(); + return (Attribute) loader.loadClass(newDynName.replace('/', '.')).newInstance(); } catch (Throwable ex) { } //--------------------------------------------------- diff --git a/src/org/redkale/util/Creator.java b/src/org/redkale/util/Creator.java index 8a43768cc..dd6e43799 100644 --- a/src/org/redkale/util/Creator.java +++ b/src/org/redkale/util/Creator.java @@ -214,14 +214,14 @@ public interface Creator { final String supDynName = Creator.class.getName().replace('.', '/'); final String interName = clazz.getName().replace('.', '/'); final String interDesc = Type.getDescriptor(clazz); - ClassLoader loader = Creator.class.getClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); String newDynName = supDynName + "_" + clazz.getSimpleName() + "_" + (System.currentTimeMillis() % 10000); if (String.class.getClassLoader() != clazz.getClassLoader()) { loader = clazz.getClassLoader(); newDynName = interName + "_Dyn" + Creator.class.getSimpleName(); } try { - return (Creator) Class.forName(newDynName.replace('/', '.')).newInstance(); + return (Creator) loader.loadClass(newDynName.replace('/', '.')).newInstance(); } catch (Throwable ex) { } diff --git a/src/org/redkale/util/Reproduce.java b/src/org/redkale/util/Reproduce.java index 0f14ecb79..71d8240de 100644 --- a/src/org/redkale/util/Reproduce.java +++ b/src/org/redkale/util/Reproduce.java @@ -35,13 +35,13 @@ public interface Reproduce extends BiFunction { final String destDesc = Type.getDescriptor(destClass); final String srcDesc = Type.getDescriptor(srcClass); String newDynName = supDynName + "Dyn_" + destClass.getSimpleName() + "_" + srcClass.getSimpleName(); - ClassLoader loader = Reproduce.class.getClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); if (String.class.getClassLoader() != destClass.getClassLoader()) { loader = destClass.getClassLoader(); newDynName = destName + "_Dyn" + Reproduce.class.getSimpleName() + "_" + srcClass.getSimpleName(); } try { - return (Reproduce) Class.forName(newDynName.replace('/', '.')).newInstance(); + return (Reproduce) loader.loadClass(newDynName.replace('/', '.')).newInstance(); } catch (Throwable ex) { } // ------------------------------------------------------------------------------ diff --git a/src/org/redkale/util/TypeToken.java b/src/org/redkale/util/TypeToken.java index ff7d5d2a2..68028a5d9 100644 --- a/src/org/redkale/util/TypeToken.java +++ b/src/org/redkale/util/TypeToken.java @@ -177,11 +177,11 @@ public abstract class TypeToken { } private static Type createParameterizedType(final Class rawType, final Type... actualTypeArguments) { - ClassLoader loader = TypeToken.class.getClassLoader(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); String newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + System.currentTimeMillis(); for (;;) { try { - Class.forName(newDynName.replace('/', '.')); + loader.loadClass(newDynName.replace('/', '.')); newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + Math.abs(System.nanoTime()); } catch (Throwable ex) { //异常说明类不存在 break;