目前我正在尝试使用Clojure创建示例Wicket页面(在现有的wicket项目中)。代码如下所示:
(ns a.set.of.packages.dataview.info.EmptyNodeInfo2Panel
(:import [a.set.of.packages.tree TreeModelBean]
[a.set.of.packages.dataview.supplemental GenericHeaderPanel]))
(gen-class
:name a.set.of.packages.dataview.info.EmptyNodeInfo2Panel
:extends org.apache.wicket.markup.html.panel.Panel
:state state
:init init
:constructors {[String a.set.of.packages.tree.TreeModelBean] [String]}
:post-init construct)
(defn -init [id model-bean]
[[id] nil])
(defn -construct [this id model-bean]
(.add this (GenericHeaderPanel. "header" model-bean)))
当页面被创建时,我得到以下运行时错误:
java.lang.IllegalArgumentException: No matching method found: add for class a.set.of.packages.dataview.info.EmptyNodeInfo2Panel
即。我无法调用超类方法。
反编译的construct
方法如下所示:
public Object invoke(Object this, Object id, Object model_bean)
throws Exception
{
this = null;
id = null;
model_bean = null;
return Reflector.invokeInstanceMethod(this, "add", new Object[] {
new GenericHeaderPanel((String)"header", (TreeModelBean)model_bean)
});
}
所有内容都设置为null
!这是构造函数参数映射,不正确的反编译还是错误的问题?
答案 0 :(得分:1)
我在Clojure内部挖掘并找到了问题的根源。标记的行不起作用。
// clojure.lang.Reflector
static public boolean paramArgTypeMatch(Class paramType, Class argType)
{
...
if(paramType == argType || paramType.isAssignableFrom(argType)) // <<<
return true;
...
可能存在类加载器问题(我使用Class.forName动态创建EmptyNodeInfo2Panel类)。
匹配的类是:
a.set.of.packages.dataview.supplemental.GenericHeaderPanel
org.apache.wicket.Component;
有趣的事情:当我从servlet respnose处理线程打印org.apache.wicket.Component
类名时,它按原样打印,但是当我从Reflector
thead打印它时(通过paramType.getName()),它打印出来以下表格:[Lorg.apache.wicket.Component
。
我使用Tomcat 5.5,有没有可能的线索?