Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

[ИЗМЕНИТЬ 2]

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

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

[/EDIT 2]

[EDIT]

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

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

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

Это обеспечивает гораздо более развязанный подход, при этом функция reflect предоставляет все виды информации о переданном аргументе (в данном случае a 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")

Ответ 2

Попробуйте 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}}
...

Ответ 3

Вы можете использовать этот метод, который использует 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)

Ответ 4

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

(doseq [m (.getMethods (type "Hello"))]
  (println "Method Name: " (.getName m))
  (println "Return Type: " (.getReturnType m) "\n"))

Ответ 5

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

(:declaredMethods (bean String))

(seq (:declaredMethods (bean String)))

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

Ответ 6

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

http://github.com/zcaudate/iroh

(.? String  #"^c" :name)
;;=> ["charAt" "checkBounds" "codePointAt" "codePointBefore"
;;    "codePointCount" "compareTo" "compareToIgnoreCase".   
;;    "concat" "contains" "contentEquals" "copyValueOf"]