Как мне увидеть методы, связанные с объектом в Clojure? - PullRequest
11 голосов
/ 02 ноября 2011

Какую функцию я использую в Clojure для просмотра методов объекта Java?

user=> (some-function some-java-object)
... lots of methods ...

Ответы [ 6 ]

10 голосов
/ 03 ноября 2011

Начиная с версии 1.3, Clojure поставляется с пространством имен clojure.reflect. В частности, функция reflect может использоваться для отображения всех методов (и другой информации) для объекта. Это не так удобно, как show. С другой стороны, он гораздо более общий и довольно легко написать собственную версию show, используя reflect в качестве строительного блока.

Например, если вы хотите увидеть все методы для String, которая возвращает String:

user=> (use 'clojure.reflect)
user=> (use 'clojure.pprint)

user=> (->> (reflect "some object") 
            :members 
            (filter #(= (:return-type %) 'java.lang.String))
            (map #(select-keys % [:name :parameter-types])) 
            print-table)
10 голосов
/ 03 ноября 2011

Используйте java отражение.

(.getClass myObject)

возвращает вас к классу.Чтобы получить методы,

(.getMethods (.getClass myObject))

, который дает вам массив методов.Вы можете рассматривать это как последовательность;Я бы, наверное, поместил его в вектор, так что:

(vec (.getMethods (.getClass myObject)))
5 голосов
/ 03 ноября 2011
user=> (map #(.getName %) (-> "foo" class .getMethods))

("equals" "toString" "hashCode" "compareTo" "compareTo" "indexOf" "indexOf" "indexOf" "indexOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "length" "isEmpty" "charAt" "codePointAt" "codePointBefore" "codePointCount" "offsetByCodePoints" "getChars" "getBytes" "getBytes" "getBytes" "getBytes" "contentEquals" "contentEquals" "equalsIgnoreCase" "compareToIgnoreCase" "regionMatches" "regionMatches" "startsWith" "startsWith" "endsWith" "lastIndexOf" "lastIndexOf" "lastIndexOf" "lastIndexOf" "substring" "substring" "subSequence" "concat" "replace" "replace" "matches" "contains" "replaceFirst" "replaceAll" "split" "split" "toLowerCase" "toLowerCase" "toUpperCase" "toUpperCase" "trim" "toCharArray" "format" "format" "copyValueOf" "copyValueOf" "intern" "wait" "wait" "wait" "getClass" "notify" "notifyAll")

Замените "foo" на ваш объект.

2 голосов
/ 03 ноября 2011

Раньше вы могли использовать show для такого рода вещей (например, с clojure 1.2.0, clojure-contrib 1.2.0).

(ns test.core
  (:use [ clojure.contrib.repl-utils :only [show]]))

Из отчета

(show Integer)

1009 * дал *

===  public final java.lang.Integer  ===
static MAX_VALUE : int 
static MIN_VALUE : int
... 

Любопытно, что я попробовал это с clojure 1.3.0 / clojure-contrib 1.2.0, и это не сработало. doc тоже кажется сломанным.

1 голос
/ 05 ноября 2011

Вы обычно делаете этот список методов, потому что вы ищете метод определенного типа ... скажем, все методы "get" в классе.Вот как вы можете сделать это для вашего объекта 'obj':

(filter #(re-find #"get" %) (map #(.getName %) (.. obj getClass getMethods)))

# "get" - это объект регулярного выражения для поиска методов, которые имеют свое имя (настройте его для своих собственных нужд)).Выражение карты просто создает последовательность всех имен методов в классе объекта;seq передается анонимной функции, которая является первым параметром, переданным фильтру.

1 голос
/ 02 ноября 2011

IIRC это не встроенный, но также короткий - см. Эту реализацию .

(Возможно, сейчас.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...