NoClassDefFoundError与java反射
我使用以下代码动态加载java中的类:NoClassDefFoundError与java反射,java,reflection,classloader,Java,Reflection,Classloader,我使用以下代码动态加载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.newInstanc
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();
URL=new File(ACTIONS_PATH).toURI().toul();
URLClassLoader-clazzLoader=新的URLClassLoader(新的URL[]{URL});
clazz=(类)clazzLoader.loadClass(名称);
返回clazz.newInstance();
这段代码适用于简单类(没有继承或接口),但我要加载的类实现了一个接口(类加载器可以使用findClass
找到该接口)
当我调用class.newInstance时,我得到了提到的异常。
我做错了什么
谢谢。您的类路径有问题。我猜这是因为您没有定义父类加载器,“url”是否包含所有需要的类,包括系统类 当类实际被解析时,您将得到异常,因此在加载的类中出现的类也将被加载。如果将
clazloader.loadClass(名称)
更改为clazloader.loadClass(名称,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();
URL=new File(ACTIONS_PATH).toURI().toul();
URLClassLoader-clazzLoader=新的URLClassLoader(新的URL[]{URL},getClass().getClassLoader());
clazz=(类)clazzLoader.loadClass(名称);
返回clazz.newInstance();
我不确定您的问题,但要编写Class
,您应该加载ClassRatingAction
,但必须已加载此类型才能编写此操作。你的意思是说ClassI能够通过简单地使用Class.forname(name)来规避这个问题吗.newInstance
但我很乐意理解为什么原始代码不起作用,因为这次您没有使用自定义的cloassloader。您在这里使用的同一个URLClassLoader是否能够找到接口?@Paulo是的,类加载器可以找到接口