【问题标题】:NoClassDefFoundError with java reflection带有java反射的NoClassDefFoundError
【发布时间】:2011-08-25 21:39:25
【问题描述】:

我正在使用以下代码在java中动态加载一个类:

URL url = new File(ACTIONS_PATH).toURI().toURL();
URLClassLoader clazzLoader = new URLClassLoader(new URL[]{url});
Class<RatingAction> clazz =  (Class<RatingAction>) clazzLoader.loadClass(name);
return clazz.newInstance(); 

此代码适用于简单的类(无继承或接口),但我要加载的类正在实现一个接口(类加载器可以使用 findClass 找到该接口) 当我调用 class.newInstance 时,我得到了提到的异常。 我做错了什么?

谢谢。

【问题讨论】:

  • 我不确定你的问题,但是要写Class&lt;RatingAction&gt;,你应该加载类RatingAction,但是这个类型必须已经加载,你才能写这个。你的意思是Class&lt;? extends RatingAction&gt;
  • 我能够通过简单地使用Class.forname(name).newInstance 来规避这个问题,但我很乐意理解为什么原始代码不起作用
  • 因为这次你没有使用自定义的类加载器。
  • 你这里用的同一个URLClassLoader能找到接口吗?
  • @Paulo 是的,类加载器可以找到接口

标签: java reflection classloader


【解决方案1】:

您的类路径有问题。我猜这是因为您没有定义父类加载器 - “url”是否包含所有需要的类,包括系统类?

当类实际被解析时,您得到了异常,因此加载的类中出现的类也被加载。如果将clazzLoader.loadClass(name) 更改为clazzLoader.loadClass(name, true),则会在 loadClass 行中得到异常。

尝试以下方法:

URL url = new File(ACTIONS_PATH).toURI().toURL();
URLClassLoader clazzLoader = new URLClassLoader(new URL[]{url}, getClass().getClassLoader());
Class<RatingAction> clazz =  (Class<RatingAction>) clazzLoader.loadClass(name);
return clazz.newInstance(); 

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2011-11-04
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多