【问题标题】:object is not an instance of declaring class on using java reflection对象不是使用 java 反射声明类的实例
【发布时间】: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


【解决方案1】:

您正在对 ClassLoader 类型的类调用方法“addURL”。 ClassLoader 类不包含成员方法“addURL”。这就是您收到错误的原因。

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

【讨论】:

  • 谢谢..我之前也试过,但它给了 ClassCastException:java.lang.ClassCastException: com.oracle.classloader.weblogic.LaunchClassLoader cannot be cast to java.net.URLClassLoader Code: URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();方法method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);方法.setAccessible(true);方法.invoke(classLoader, url);
  • 请参考上面Holger的评论。为此,您确实应该创建自己的 URLClassLoader 实例,而不是使用 ClassLoader.getSystemClassLoader() 方法。
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2017-05-05
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多