【发布时间】:2019-12-20 09:41:50
【问题描述】:
我正在尝试使用 java 反射和 classLoader 从 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)
请让我知道这可能是什么问题,或者这不是正确的方法。
【问题讨论】:
-
您正试图在运行时修改系统类加载器。没有正确的方法可以做到这一点,因此您遇到错误是一件好事。
-
我无法复制。在我的机器上,它接到了
loadClass电话。 -
那么运行时没有办法做到吗?
-
@Sweeper 这是因为在某些系统上,系统类负载可能是
URLClassLoader。考虑到广泛的典型实现,OP 很可能使用 Java 9 或更高版本,而您使用的是 Java 8 或更早版本。 -
@LearningJava 当您想从 URL 动态加载类时,您应该创建自己的
URLClassLoader。就是这样做的,它甚至不需要具有访问覆盖的反射。
标签: java reflection classloader urlclassloader