Java类加载器: Why an "NoSuchMethodEx" is thrown here?

标签 java reflection nosuchmethoderror cglib

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

最佳答案

我不熟悉您正在使用的框架。但如果我做对了,那么您创建的新类加载器就是异常的原因。如果您从 jcl 获取 DaemonContext 的实例,您应该能够调用该方法。您还可以创建新的类加载器作为应用程序类加载器的子级。目前的情况是,有两个 DaemonContext 类型的不同类,每个类加载器都来自不同的类加载器。

关于Java类加载器: Why an "NoSuchMethodEx" is thrown here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444733/

相关文章:

java - Log4j2 网络查询

java - 如何使用反射来获取对可以传递的 lambda 的引用?

java - AndroidBoostrap预览模式: Font not properly registered

java - 以编程方式从java调用Linux终端中的python脚本

Java 录制屏幕的速度不够快

java - 清理项目后出现 NoSuchMethodError

java - 无法启动 Oryx - NoSuchMethodError

.net - 在运行时设置可浏览属性的值

c# - 查找实现具有特定 T 类型的特定通用接口(interface)的所有类型

java - 了解 NoSuchMethod 异常中的方法签名