Java getMethod“;“未找到类”;
我有一个应用程序需要动态加载一些适配器。其中一些适配器被编译到应用程序中,而另一些则在运行时提供。一旦有了适配器,我就要调用适配器上的adapt(OrderToolRequest,Object)方法 我的问题是,当类在应用程序中时,我可以让它工作。但是,对于第三方适配器,我可以动态加载运行时提供的类,但我不知道如何调用该方法。我在OrderToolResponse上收到“未找到类”错误。我试图通过让所有适配器实现接口和强制转换,并通过简单地使用反射来获得方法来实现这一点 我假设这与不同的类装入器有关,但我的知识还不足以解决这个问题。谁能给我指出正确的方向吗 在下面的代码中,在调用getMethod()之前,一切正常。如果我们在应用程序中找到该类,则会成功。如果该类是由URLClassLoader加载的,则会抛出“找不到类”错误Java getMethod“;“未找到类”;,java,reflection,classloader,classnotfoundexception,Java,Reflection,Classloader,Classnotfoundexception,我有一个应用程序需要动态加载一些适配器。其中一些适配器被编译到应用程序中,而另一些则在运行时提供。一旦有了适配器,我就要调用适配器上的adapt(OrderToolRequest,Object)方法 我的问题是,当类在应用程序中时,我可以让它工作。但是,对于第三方适配器,我可以动态加载运行时提供的类,但我不知道如何调用该方法。我在OrderToolResponse上收到“未找到类”错误。我试图通过让所有适配器实现接口和强制转换,并通过简单地使用反射来获得方法来实现这一点 我假设这与不同的类装入器
Class<?> cls = null;
try
{
// #1
cls = Class.forName( adapterName );
}
catch ( ClassNotFoundException e )
{
File file = new File( "Adapters" );
URL url = file.toURI().toURL();
URL[] urls = new URL[]{ url };
URLClassLoader loader = new URLClassLoader( urls );
try
{
// #2
cls = loader.loadClass( adapterName );
}
finally
{
loader.close();
}
}
Constructor<?> constructor = cls.getConstructor();
Object instance = constructor.newInstance();
// #3 THE PROBLEM OCCURS HERE. SUCCEEDS IF LOADED BY #1, BUT FAILS IF LOADED
// BY #2.
Method adaptMethod = cls.getMethod( "adapt", OrderToolRequest.class, Object.class );
...invoke the method, etc.
并在日志语句上设置断点,然后:
- e、 原因=“ClassNotFoundException”
- e、 详细信息= “com/ca/eai/model/canonical/OrderToolResponse”
java.lang.NoClassDefFoundError: com/ca/eai/model/canonical/OrderToolResponse
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
at java.lang.Class.getMethod0(Class.java:2685)
at java.lang.Class.getMethod(Class.java:1620)
at com.ca.eai.esb.transformer.orchestration.AdapterInvokingTransformer.findAdapter(AdapterInvokingTransformer.java:73)
at com.ca.eai.esb.transformer.orchestration.AdapterInvokingTransformer.transformMessage(AdapterInvokingTransformer.java:106)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:145)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:93)
at org.mule.DefaultMuleMessage.transformMessage(DefaultMuleMessage.java:1455)
at org.mule.DefaultMuleMessage.applyAllTransformers(DefaultMuleMessage.java:1363)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1341)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1333)
at org.mule.transformer.AbstractTransformer.process(AbstractTransformer.java:123)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:54)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.access$001(InterceptingChainLifecycleWrapper.java:26)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper$1.process(InterceptingChainLifecycleWrapper.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:65)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:54)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.access$001(InterceptingChainLifecycleWrapper.java:26)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper$1.process(InterceptingChainLifecycleWrapper.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:65)
at org.mule.routing.AbstractSelectiveRouter.processEventWithProcessor(AbstractSelectiveRouter.java:312)
at org.mule.routing.AbstractSelectiveRouter.routeWithProcessors(AbstractSelectiveRouter.java:302)
at org.mule.routing.AbstractSelectiveRouter.process(AbstractSelectiveRouter.java:202)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.processor.AsyncInterceptingMessageProcessor.process(AsyncInterceptingMessageProcessor.java:101)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:44)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.construct.AbstractPipeline$1.process(AbstractPipeline.java:112)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:54)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.access$001(InterceptingChainLifecycleWrapper.java:26)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper$1.process(InterceptingChainLifecycleWrapper.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:65)
at org.mule.construct.Flow$1.process(Flow.java:74)
at org.mule.construct.Flow$1.process(Flow.java:69)
at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:20)
at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:34)
at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:18)
at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:58)
at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:54)
at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:32)
at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:17)
at org.mule.execution.ErrorHandlingExecutionTemplate.execute(ErrorHandlingExecutionTemplate.java:63)
at org.mule.execution.ErrorHandlingExecutionTemplate.execute(ErrorHandlingExecutionTemplate.java:34)
at org.mule.construct.Flow.process(Flow.java:68)
...SOME STUFF REMOVED HERE...
Caused by: java.lang.ClassNotFoundException: com.ca.eai.model.canonical.OrderToolResponse
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 260 more
请勿关闭装载机。Javadoc: 关闭此URLClassLoader,使其不再用于加载 此加载程序定义的新类或资源
没有看到我们试图检索的类或方法,但是查看您提供的异常原因,我认为不会抛出ClassNotFoundException
相反,目标方法“adapt”的返回类型可能为com.ca.eai.model.canonical.OrderToolResponse,而该类不在类路径中 如下构造URL加载器解决了我的问题
URLClassLoader loader = new URLClassLoader( urls, OrderToolResponse.class.getClassLoader() );
我仍然不确定默认类加载器为什么不工作。编译器如何知道OrderToolRequest是什么?它在生成文件中吗?它在通过Maven依赖项引入的类路径中的一个jar中。如何抛出类未找到异常?@A4L:如果找不到参数类型。@Ali C:注意,我没有说它在抛出异常;我说这是个错误。尽管如此,我还是编辑了文章以包含堆栈跟踪。
URLClassLoader=newurlclassloader(url,ClassLoader.getSystemClassLoader())代码>将是我的下一个想法。不仅为cls类提供URLClassLoader,还提供系统类装入器。或者getClass.getClassLoader()
。然而,这种想法确实让我找到了一个解决方法。更改为URLClassLoader=newURLClassLoader(URL,OrderToolResponse.class.getClassLoader());这个类和OrderToolRequest在同一个jar中。我可以在这个函数的代码中插入一行“OrderToolResponse=new OrderToolResponse();”,它工作得非常好。这与URLClassLoader在其路径中没有jar这一事实有关吗?尝试一下并没有什么坏处,但是按照您定义它的方式,URLClassLoader应该委托给默认的类加载器,这样就可以在类路径中找到东西。如果您使用新的URLClassLoader(URL,null)实例化URLClassLoader,它将不会委托,那么我会期望出现这种行为……URLClassLoader=newURLClassLoader(URL,OrderToolResponse.class.getClassLoader());工作。
URLClassLoader loader = new URLClassLoader( urls, OrderToolResponse.class.getClassLoader() );