使用代理

时间:2017-10-27 13:05:35

标签: clojure

我是Clojure的新手,我正在尝试为Clojure实现一个Java接口。特别是这段代码

import javax.print.*;

class Test {

    public static void main (String [] args)
    {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        System.out.println("Number of print services: " + printServices.length);

        for (PrintService printer : printServices)
            System.out.println("Printer: " + printer.getName()); 
    }
}

PrintService是一个接口,PrintServiceLookup是一个constaructor类。我对如何使用reify和代理感到困惑。我的目标是在我的系统上安装已安装的打印机。 任何人都可以解释如何使用reify或代理?从文档中我明白我必须加载界面,然后加载我想要使用的方法,但我不能使它工作。 从我理解的Java角度来看,我必须从PrintServiceLookup.lookupPrintServices()获取一个对象并从getName接口应用PrintService函数然后打印它。 我的尝试到现在为止

(defn print-serv []
  (let [printS (proxy [PrintService PrintServiceLookup] []
       (getName [])
                 (lookupPrintServices [])
    )]
    (.println (System/out) (.getName printSe))
    )

    )

我很确定这一切都是错误的,但我无法理解如何真正的知情和代理工作,如果有人能够更好地将它告诉我,我将不胜感激!

1 个答案:

答案 0 :(得分:2)

您发布的Java代码没有实现接口。看起来你只是试图调用一个静态方法并迭代结果:

(let [printers (PrintServiceLookup/lookupPrintServices nil nil)]
  (println "Number of print services:" (count printers))

  (doseq [^PrintService p, printers]
    (println (.getName p)))

doseq循环也可以简单地写为:

(doseq [p printers]
  ...)

我刚刚提供了^PrintService类型提示以便完整性。

另请注意,您不必撰写完整的(.println (System/out) ...)。 Clojure有println捷径。