NoSuchMethodException:对于jdk1.8.0中的sun.misc.Launcher$AppClassLoader.addAppURL(java.net.URL)

NoSuchMethodException:对于jdk1.8.0中的sun.misc.Launcher$AppClassLoader.addAppURL(java.net.URL),java,python,java-8,Java,Python,Java 8,我在代码中面临一个非常奇怪的问题。我使用下面的代码下载我的jar文件。这在JAVA-5和JAVA-6中正常工作 def AddJarToClassloader(self,u): #sysloader = java.lang.ClassLoader.getSystemClassLoader() sysloader = java.net.ClassLoader.getSystemClassLoader() sysclass = sysloader.getClass()

我在代码中面临一个非常奇怪的问题。我使用下面的代码下载我的jar文件。这在JAVA-5和JAVA-6中正常工作

def AddJarToClassloader(self,u):
    #sysloader = java.lang.ClassLoader.getSystemClassLoader()
    sysloader = java.net.ClassLoader.getSystemClassLoader()
    sysclass = sysloader.getClass()
    print 'All Methods:  ' + str(sysclass.getDeclaredMethods())
    method = sysclass.getDeclaredMethod("addAppURL", [java.net.URL])
    print 'All method= ' + str(method)
    method.setAccessible(1)
    jar_a = java.net.URL(u)
    b = method.invoke(sysloader, [jar_a])
    return sysloader
但是,最近我们将所有Linux机器更新为Java8。现在,此代码不再工作。我在日志文件中发现以下错误。谁能帮我解决这个问题

JAVA-8的错误日志:

[java] All Methods:  array(java.lang.reflect.Method, [public java.lang.Class sun.misc.Launcher$AppClassLoader.loadClass(java.lang.String,boolean) throws java.lang.ClassNotFoundException, private void sun.misc.Launcher$AppClassLoader.appendToClassPathForInstrumentation(java.lang.String), private static java.security.AccessControlContext sun.misc.Launcher$AppClassLoader.getContext(java.io.File[]) throws java.net.MalformedURLException, protected java.security.PermissionCollection sun.misc.Launcher$AppClassLoader.getPermissions(java.security.CodeSource), public static java.lang.ClassLoader sun.misc.Launcher$AppClassLoader.getAppClassLoader(java.lang.ClassLoader) throws java.io.IOException])
 [java] java.lang.NoSuchMethodException: sun.misc.Launcher$AppClassLoader.addAppURL(java.net.URL)
 [java]     at java.lang.Class.getDeclaredMethod(Class.java:2130)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [java]     at java.lang.reflect.Method.invoke(Method.java:498)
 [java]     at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:175)
 [java]     at org.python.core.PyObject.__call__(PyObject.java:355)
 [java]     at org.python.core.PyMethod.__call__(PyMethod.java:215)
 [java]     at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:221)
 [java]     at org.python.core.PyMethod.__call__(PyMethod.java:206)
 [java]     at org.python.core.PyObject.__call__(PyObject.java:414)
 [java]     at org.python.core.PyObject.__call__(PyObject.java:418)

在Java8中,方法
addAppURL
似乎从
sun.misc.Launcher$AppClassLoader
类中删除了。但是您可以尝试使用方法
java.net.URLClassLoader#addURL
,因为
URLClassLoader
sun.misc.Launcher$AppClassLoader
的父级

所以试着换一条线

method = sysclass.getDeclaredMethod("addAppURL", [java.net.URL])
用线

method = sysclass.getSuperclass().getDeclaredMethod("addURL", [java.net.URL])

…在Java 9及更高版本中被破坏。@Holger,这是一个有用的补充,当我找到Java 9及更高版本的智能解决方案时,我将更新我的答案。顺便说一句,在for Java 9中,Oracle说“请注意,Java SE和JDK没有为应用程序或库提供API,以便在运行时动态扩展类路径”。实际上,Instrumentation API提供了一种向类路径添加条目的标准化方法,但是,这不是一个强制功能。除此之外,动态扩展类路径确实从未得到官方支持。