【问题标题】:Clojure: extend Wicket panel and call to panel methodsClojure:扩展 Wicket 面板并调用面板方法
【发布时间】:2009-10-28 08:23:33
【问题描述】:

目前我正在尝试使用 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!这是构造函数参数映射的问题,反编译不正确还是bug?

【问题讨论】:

    标签: clojure methods wicket


    【解决方案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 响应处理线程打印 org.apache.wicket.Component 类名时,它按原样打印,但是当我从 Reflector thead 打印它时(通过 paramType.getName()),它以以下形式打印:@ 987654325@。 我用的是Tomcat 5.5,有什么线索吗?

    【讨论】:

    • "它以以下形式打印:[Lorg.apache.wicket.Component" 左方括号表示后面的类的数组。
    • 是的,我只是想通了,下面的构造方法有效:(defn -construct [this id model-bean] (.add this (into-array [(GenericHeaderPanel."header" model-bean) )])) 我在 Panel 类的 add 方法上不注意阅读 Wicket 文档。它需要可变参数...我度过了疯狂的一天 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多