有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当我们使用Java反射调用配置类时,Spring无法加载它

我使用Java反射在启动时阻塞Spring,所以我使用注释配置实现Spring,然后我有以下类作为Spring配置

@Configuration
@ComponentScan(basePackages = "com.jet.reader")
public class QueueReaderConfig {

    @Bean(name = "jetListener")
    public JetReaderListener listener() {
        return new JetReaderListener();
    }

    @Bean(name = "rbtReaderService")
    public QueueReaderService queueReaderService() {
        return new QueueReaderServiceImpl();
    }
}

然后使用以下命令启动Spring

context = new AnnotationConfigApplicationContext(QueueReaderConfig.class);
rbtReaderService = context.getBean(QueueReaderServiceImpl.class);

当我使用JUnit或通过Main类运行应用程序时,它会正常运行,但当我使用Java反射运行应用程序时,它会显示错误(包装Spring的类是使用URLClassLoader加载的)

URL[] urls = { new URL("jar:file:" + plugin + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls);
...
Class<?> c = Class.forName (className, true, cl);
...
Object instance = c.newInstance();
...
Method loadMethod = c.getDeclaredMethod("load", OED.class);
loadMethod.setAccessible(true);
loadMethod.invoke(instance, param);

该脚本产生以下异常

2015-01-08T21:17:43.000+1100 com.jet.reader.executor.JetQueueReaderExecutor 57 (DEBUG):java.lang.IllegalStateException: Cannot load configuration class: com.jet.reader.config.QueueReaderConfig
java.lang.reflect.InvocationTargetException
    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:483)
    at com.jet.godi.GodiAppConsoleMain.execute(GodiAppConsoleMain.java:143)
    at com.jet.godi.GodiAppConsoleMain.executePlugins(GodiAppConsoleMain.java:92)
    at com.jet.godi.GodiAppConsoleMain.<init>(GodiAppConsoleMain.java:42)
    at com.jet.godi.GodiAppConsoleMain.main(GodiAppConsoleMain.java:231)

如果有人和我有同样的经历,请在这里分享你的解决方案

谢谢


共 (0) 个答案