我对“ 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()方法?

最佳答案

我不熟悉您使用的框架。但是,如果我做的比新的Class loader正确,那就是产生异常的原因。如果要从jcl获取DaemonContext的实例,则应该可以调用该方法。您还可以将新的类加载器创建为应用程序类加载器的子级。当前的方式是,每个不同的类加载器都有两种不同的DaemonContext类型的类。

10-04 13:18