2011-11-02 17 views

Trả lời

8

Sử dụng phản chiếu java.

(.getClass myObject) 

giúp bạn trở thành lớp học. Để nhận các phương thức,

(.getMethods (.getClass myObject)) 

Cung cấp cho bạn một loạt các phương pháp. Bạn có thể đối xử với nó như một chuỗi; Tôi có lẽ muốn đặt nó vào một vector, vì vậy:

(vec (.getMethods (.getClass myObject))) 
1

IIRC nó không được xây dựng-in, nhưng nó cũng short-- see this implementation.

(Nó có thể là bây giờ.)

2

Bạn sử dụng để có thể sử dụng show cho các loại điều này (ví dụ, với clojure 1.2.0, clojure-contrib 1.2.0).

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

Từ REPL

(show Integer) 

mang lại

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

Tò mò, tôi đã cố gắng này với clojure 1.3.0/clojure-contrib 1.2.0 và nó đã không làm việc. doc dường như cũng bị hỏng.

+0

trong 1.2.0 bạn đã bao gồm/sử dụng để nhận điều này? nó là cốt lõi? –

+0

@Arthur Nó nằm trong clojure.contrib.repl-utils. Tôi đã thêm macro không gian tên ở trên để làm rõ. –

+0

Vì vậy, điều này không hoạt động nữa? –

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

Thay thế "foo" với đối tượng của bạn.

8

Kể từ phiên bản 1.3, Clojure đi kèm với không gian tên clojure.reflect. Có thể sử dụng hàm reflect để hiển thị tất cả các phương thức (và các thông tin khác) cho một đối tượng. Nó không phải là khá thuận tiện để sử dụng như show. Mặt khác, nó là tổng quát hơn nhiều và nó là khá dễ dàng để viết phiên bản của riêng bạn của show sử dụng reflect như là một khối xây dựng.

Ví dụ, nếu bạn muốn xem tất cả các phương pháp cho String trả về một 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) 
+0

Tính năng này có hoạt động với v1.2.1 (nếu tôi thêm phụ thuộc vào tệp project.clj) không? –

+0

Không, chỉ có trong 1.3 – Jonas

1

Bạn thường làm niêm yết phương pháp này bởi vì bạn đang tìm kiếm một loại đặc biệt của method..say tất cả phương thức "get" trong lớp. Đây là cách bạn có thể làm điều đó cho đối tượng của bạn 'obj':

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

CáC# "nhận được" là đối tượng biểu hiện thường xuyên để tìm kiếm các phương pháp mà có được trong tên của họ (tùy chỉnh nó cho nhu cầu riêng của bạn). Biểu thức bản đồ đơn giản tạo ra một seq của tất cả các tên phương thức trong lớp của đối tượng; seq được cấp cho hàm ẩn danh là tham số đầu tiên được chuyển tới bộ lọc.

Các vấn đề liên quan