Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象不是使用java反射在上声明类的实例_Java_Reflection_Classloader_Urlclassloader - Fatal编程技术网

对象不是使用java反射在上声明类的实例

对象不是使用java反射在上声明类的实例,java,reflection,classloader,urlclassloader,Java,Reflection,Classloader,Urlclassloader,我正在尝试使用java反射和类加载器从URL加载一个类。该应用程序部署在weblogic 12c服务器上 File f = new File("/a/abc"); URL url = f.toURI().toURL(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); Method method = URLClassLoader.class.getDecl

我正在尝试使用java反射和类加载器从URL加载一个类。该应用程序部署在weblogic 12c服务器上

        File f = new File("/a/abc");
        URL url = f.toURI().toURL();
        ClassLoader classLoader =  ClassLoader.getSystemClassLoader();
        Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        method.setAccessible(true);
        method.invoke(classLoader, url);
        Class jobClass = classLoader.loadClass("com.test.abc");
但是,我得到以下错误:

引发异常:

java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)

请告诉我这里可能有什么问题,或者这不是正确的方法。

您正在类加载器类型的类上调用“addURL”方法。类类加载器不包含成员方法“addURL”。这就是为什么你会出错


相反,您应该使用URLClassLoader类型的对象调用方法的“invoke”方法。

您试图在运行时修改系统类加载器。没有正确的方法可以做到这一点,所以你会出错是件好事。我无法重现。在我的机器上,它得到了
loadClass
调用。所以在运行时没有办法这样做?@Sweeper这是因为在某些系统上,系统类加载可能是
URLClassLoader
。考虑到广泛的典型实现,OP可能使用Java 9或更高版本,而您使用的是Java 8或更高版本。@LearningJava当您想从URL动态加载类时,您应该创建自己的
URLClassLoader
。这就是方法,它甚至不需要访问覆盖的反射。谢谢..我之前也尝试过,但它给出了ClassCastException:java.lang.ClassCastException:com.oracle.classloader.weblogic.LaunchClassLoader不能转换为java.net.URLClassLoader代码:URLClassLoader classloader=(URLClassLoader)getSystemClassLoader();方法Method=URLClassLoader.class.getDeclaredMethod(“addURL”,URL.class);方法setAccessible(true);调用(类加载器,url);请参考上述霍尔格的评论。为此,您确实应该创建自己的URLClassLoader实例,而不是使用ClassLoader.getSystemClassLoader()方法。