Merge pull request #38 from Luohuayu/patch-1

Implement load dependency in LaunchClassLoader
master
Arasple 2020-02-16 19:43:59 +08:00 committed by GitHub
commit a94f328fb2
1 changed files with 10 additions and 5 deletions

View File

@ -20,11 +20,16 @@ public class TDependencyLoader {
public static synchronized void addToPath(Plugin plugin, URL url) {
try {
ClassLoader loader = plugin instanceof InternalPlugin ? Bukkit.class.getClassLoader() : plugin.getClass().getClassLoader();
Field ucpField = loader.getClass().getDeclaredField("ucp");
long ucpOffset = Ref.getUnsafe().objectFieldOffset(ucpField);
Object ucp = Ref.getUnsafe().getObject(loader, ucpOffset);
MethodHandle methodHandle = Ref.lookup().findVirtual(ucp.getClass(), "addURL", MethodType.methodType(void.class, java.net.URL.class));
methodHandle.invoke(ucp, url);
if ("LaunchClassLoader".equals(loader.getClass().getSimpleName())) {
MethodHandle methodHandle = Ref.lookup().findVirtual(loader.getClass(), "addURL", MethodType.methodType(void.class, java.net.URL.class));
methodHandle.invoke(loader, url);
} else {
Field ucpField = loader.getClass().getDeclaredField("ucp");
long ucpOffset = Ref.getUnsafe().objectFieldOffset(ucpField);
Object ucp = Ref.getUnsafe().getObject(loader, ucpOffset);
MethodHandle methodHandle = Ref.lookup().findVirtual(ucp.getClass(), "addURL", MethodType.methodType(void.class, java.net.URL.class));
methodHandle.invoke(ucp, url);
}
} catch (Throwable e) {
e.printStackTrace();
}