From c88d0b402d59249f20aadec621513a592a17bf96 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 31 May 2017 21:19:51 +0800 Subject: [PATCH] --- src/org/redkale/boot/Application.java | 2 +- src/org/redkale/boot/NodeClassLoader.java | 30 +++++++++++++++++++++-- src/org/redkale/boot/NodeServer.java | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index c9bfd3628..4e86f745f 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -267,7 +267,7 @@ public final class Application { } } this.transportFactory = new TransportFactory(transportExec, transportPool, transportGroup); - this.classLoader = new NodeClassLoader(Thread.currentThread().getContextClassLoader()); + this.classLoader = new NodeClassLoader((URLClassLoader)Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(this.classLoader); } diff --git a/src/org/redkale/boot/NodeClassLoader.java b/src/org/redkale/boot/NodeClassLoader.java index 433f78c97..42e409adb 100644 --- a/src/org/redkale/boot/NodeClassLoader.java +++ b/src/org/redkale/boot/NodeClassLoader.java @@ -5,6 +5,7 @@ */ package org.redkale.boot; +import java.lang.reflect.Method; import java.net.*; /** @@ -13,7 +14,20 @@ import java.net.*; */ public class NodeClassLoader extends URLClassLoader { - public NodeClassLoader(ClassLoader parent) { + private static final Method addURLMethod; + + static { + Method m = null; + try { + m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + m.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + addURLMethod = m; + } + + public NodeClassLoader(URLClassLoader parent) { super(new URL[0], parent); } @@ -23,6 +37,18 @@ public class NodeClassLoader extends URLClassLoader { @Override public void addURL(URL url) { - super.addURL(url); + try { + addURLMethod.invoke(getParent(), url); + } catch (RuntimeException re) { + throw re; + } catch (Exception e) { + throw new RuntimeException(e); + } } + + @Override + public URL[] getURLs() { + return ((URLClassLoader) getParent()).getURLs(); + } + } diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 525ba837d..13d276890 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -89,7 +89,7 @@ public abstract class NodeServer { this.resourceFactory = application.getResourceFactory().createChild(); this.server = server; this.logger = Logger.getLogger(this.getClass().getSimpleName()); - this.classLoader = new NodeClassLoader(Thread.currentThread().getContextClassLoader()); + this.classLoader = new NodeClassLoader((URLClassLoader)Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(this.classLoader); }