2011-11-02 15 views

Respuesta

8

Use la reflexión de java.

(.getClass myObject) 

te lleva la clase. Para obtener métodos,

(.getMethods (.getClass myObject)) 

Lo que le ofrece una variedad de métodos. Puedes tratar eso como una secuencia; Probablemente me puse en un vector, por lo que:

(vec (.getMethods (.getClass myObject))) 
2

Usted solía ser capaz de utilizar show para este tipo de cosas (por ejemplo, con clojure 1.2.0, 1.2.0 clojure-contrib).

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

Desde el REPL

(show Integer) 

produjo

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

Curiosamente, he intentado esto con clojure 1.3.0/1.2.0 clojure-contrib y no funcionó. doc parece roto también.

+0

en 1.2.0 ¿qué incluiste/usas para obtener esto? ¿Estaba en el núcleo? –

+0

@Arthur Fue en clojure.contrib.repl-utils. Agregué la macro del espacio de nombres de arriba para una aclaración. –

+0

¿Entonces esto ya no funciona? –

3
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") 

reemplazar "foo" con su objeto.

8

Desde la versión 1.3, Clojure viene incluido con el espacio de nombres clojure.reflect. La función reflect en particular se puede usar para mostrar todos los métodos (y otra información) para un objeto. No es tan conveniente usarlo como show. Por otro lado, es mucho más general y es bastante fácil escribir su propia versión de show usando reflect como un bloque de creación.

A modo de ejemplo, si desea ver todos los métodos para la cadena que devuelve una cadena:

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) 
+0

¿Funciona esto con v1.2.1 (si agrego una dependencia al archivo project.clj)? –

+0

No, solo está en 1.3 – Jonas

1

que suele hacer este método la lista porque se está buscando un tipo particular de toda method..say el tipo de "obtener" en la clase. Aquí es cómo se puede hacer eso para el objeto 'obj':

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

El # "obtener" es el objeto de expresión regular para buscar métodos que tienen se interponga en su nombre (personalizarlo para su propia necesidad). La expresión de mapa simplemente produce una secuencia de todos los nombres de métodos en la clase del objeto; el seq se alimenta a la función anónima que es el primer parámetro pasado a filter.

Cuestiones relacionadas