Как я могу получить методы класса Java из Clojure? - PullRequest
61 голосов
/ 28 апреля 2011

Как я могу получить методы класса Java из Clojure?

Ответы [ 6 ]

58 голосов
/ 28 апреля 2011

[РЕДАКТИРОВАТЬ 2]

В приведенном ниже комментарии М Смита это тоже самое, но обеспечивает сортировку по имени метода и возвращает только методы:

(print-table
  (sort-by :name 
    (filter :exception-types (:members (r/reflect "foo")))))

[/ EDIT 2]

[EDIT]

Мой первоначальный ответ относится к Clojure 1.2, но с Clojure 1.3 все изменилось.Теперь это работает без какой-либо зависимости от библиотек Contribute Clojure:

(require '[clojure.reflect :as r])
(use '[clojure.pprint :only [print-table]])

(print-table (:members (r/reflect "foo")))

Это обеспечивает гораздо более несвязанный подход с функцией reflect, предоставляющей все виды информации о передаваемом аргументе (в данном случаеString "foo") и функция print-table берет любую общую табличную структуру данных и довольно печатает ее как таковую.

Это родом из этой темы в группе Google .

[/ EDIT]

Я бы использовал функцию show в пространстве имен clojure.contrib.repl-utils, которая будет печатать все статические и экземпляры для объекта (иликласс объекта).Мне нужно вот так:

(require '[clojure.contrib.repl-utils :as ru])

Вот пример использования Joda Time:

(import 'org.joda.time.DateTime)
(ru/show DateTime)
(ru/show (DateTime.))

Первый пример демонстрирует, как вы можете просто передать класс в show, а второйдемонстрирует, что вы также можете передать экземпляр класса.

Это, конечно, работает для многих элементов Clojure, которые являются Java-классами ниже.Вот пример просмотра всех методов, доступных для экземпляра java.lang.String:

(ru/show "foo")
23 голосов
/ 04 мая 2011

Попробуйте clojure.reflect , доступный в последних выпусках Clojure 1.3.0-alpha *. Он возвращает структуры данных Clojure, которые вы можете искать / фильтровать при необходимости.

Clojure 1.3.0-alpha6
user=> (use 'clojure.reflect 'clojure.pprint)
nil
user=> (pprint (reflect "hello"))
{:bases
 #{java.io.Serializable java.lang.Comparable java.lang.Object
   java.lang.CharSequence},
 :flags #{:public :final},
 :members
 #{{:name valueOf,
    :return-type java.lang.String,
    :declaring-class java.lang.String,
    :parameter-types [boolean],
    :exception-types [],
    :flags #{:static :public}}
...
21 голосов
/ 30 июня 2012

Вы можете использовать этот метод, который использует clojure.reflect и расширяет предыдущие ответы:

(use 'clojure.reflect)

(defn all-methods [x]
    (->> x reflect 
           :members 
           (filter :return-type)  
           (map :name) 
           sort 
           (map #(str "." %) )
           distinct
           println))

Использование:

 (all-methods "")
 ; => (.charAt .checkBounds .codePointAt .codePointBefore .codePointCount .compareTo .compareToIgnoreCase .concat .contains .contentEquals .copyValueOf .endsWith .equals .equalsIgnoreCase .format .getBytes .getChars .hashCode .indexOf .intern .isEmpty .lastIndexOf .length .matches .offsetByCodePoints .regionMatches .replace .replaceAll .replaceFirst .split .startsWith .subSequence .substring .toCharArray .toLowerCase .toString .toUpperCase .trim .valueOf)

 (all-methods 1)
 ; => (.bitCount .byteValue .compareTo .decode .doubleValue .equals .floatValue .getChars .getLong .hashCode .highestOneBit .intValue .longValue .lowestOneBit .numberOfLeadingZeros .numberOfTrailingZeros .parseLong .reverse .reverseBytes .rotateLeft .rotateRight .shortValue .signum .stringSize .toBinaryString .toHexString .toOctalString .toString .toUnsignedString .valueOf)

 (all-methods java.util.StringTokenizer)
 ; => (.countTokens .hasMoreElements .hasMoreTokens .isDelimiter .nextElement .nextToken .scanToken .setMaxDelimCodePoint .skipDelimiters)
14 голосов
/ 28 апреля 2011

Этот код напечатает все открытые методы, как объявленные, так и унаследованные.

(doseq [m (.getMethods (type "Hello"))]
  (println "Method Name: " (.getName m))
  (println "Return Type: " (.getReturnType m) "\n"))
5 голосов
/ 08 апреля 2013

это вернет массив Java объявленных методов:

(:declaredMethods (bean String))

(seq (:declaredMethods (bean String)))

преимущество в том, что bean-компонент находится в clojure.core

4 голосов
/ 13 февраля 2014

Попробуйте мою новую библиотеку:

http://github.com/zcaudate/iroh

(.? String  #"^c" :name)
;;=> ["charAt" "checkBounds" "codePointAt" "codePointBefore"
;;    "codePointCount" "compareTo" "compareToIgnoreCase".   
;;    "concat" "contains" "contentEquals" "copyValueOf"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...