【发布时间】:2015-05-25 19:18:53
【问题描述】:
“JavaClassLoader”库有问题。我想为应用程序编写一个启动器。最后应该可以关闭程序,更新并重新启动。 现在,当我尝试使用参数调用方法时,我总是得到一个 NoSuchMethodEx。
我要启动的主类,实现如下(apache Daemon 的一部分):
package org.apache.commons.daemon;
public interface Daemon {
public void init(DaemonContext context) throws DaemonInitException, Exception;
public void start() throws Exception;
public void stop() throws Exception;
public void destroy();
}
在我的启动器中发生以下情况:
// set cglib proxy
ProxyProviderFactory.setDefaultProxyProvider(new CglibProxyProvider());
// load instance
JarClassLoader jcl = new JarClassLoader();
jcl.add("application.jar");
JclObjectFactory factory = JclObjectFactory.getInstance(true);
this.application = (Daemon) factory.create(jcl, "de.FabiUnne.Application");
现在,如果我尝试调用不带参数的方法(例如 #start()),一切正常。当我尝试调用 #init(DaemonContext) 方法时出现错误。
堆栈跟踪:
Exception in thread "main" java.lang.NoSuchMethodException: de.FabiUnne.Application.init(org.apache.commons.daemon.DaemonContext)
at java.lang.Class.getMethod(Class.java:1670)
at org.xeustechnologies.jcl.proxy.CglibProxyProvider$CglibProxyHandler.intercept(CglibProxyProvider.java:52)
at org.apache.commons.daemon.Daemon$$EnhancerByCGLIB$$b9db6482.init(<generated>)
and 2 more...
有趣的是,无论如何,该方法确实存在。
<- this.application.getClass().getMethods()
-> [ ...
public final void org.apache.commons.daemon.Daemon$$EnhancerByCGLIB$$b9db6482.init(org.apache.commons.daemon.DaemonContext) throws org.apache.commons.daemon.DaemonInitException,java.lang.Exception,
public final void org.apache.commons.daemon.Daemon$$EnhancerByCGLIB$$b9db6482.start() throws java.lang.Exception,
public final void org.apache.commons.daemon.Daemon$$EnhancerByCGLIB$$b9db6482.destroy(),
public final void org.apache.commons.daemon.Daemon$$EnhancerByCGLIB$$b9db6482.stop() throws java.lang.Exception,
... ]
为什么我还是不能调用#init() 方法?
【问题讨论】:
标签: java reflection nosuchmethoderror cglib