2010-08-08 26 views
6

Sử dụng đa phương thức, chúng tôi có thể thêm các phương thức vào các lớp Java hiện có. Câu hỏi của tôi là liệu có thể xác định lại một phương thức cụ thể hay không và cách từ mã Clojure. Ví dụ, nếu bạn có lớp sau,Có thể định nghĩa lại các phương thức Java từ Clojure không?

public class Shape { 
    public void draw() { 
     ... 
    } 
} 

Tôi muốn để có thể chạy một cái gì đó để thêm một phương pháp trước, như thế này:

(attach-to-method Shape/draw :before 
    (println "... about to draw a shape")) 

Và sau khi đánh giá hình thức đó, tất cả các cuộc gọi tiếp theo để vẽ sẽ bắt đầu in một chuỗi trước khi thực hiện cuộc gọi.

Mục đích của tôi với tệp đính kèm này trước/sau/xung quanh, hành vi giống như AOP, là khuôn khổ gọi phương thức đó trên cá thể hiện có có thể được thay đổi động và bắt đầu chạy mã mới đính kèm. Hiện tại tôi đang sử dụng AspectJ cho điều đó, nhưng tôi đang đi đến một điểm mà bằng cách sử dụng một trình biên dịch khác nhau không phải là một lựa chọn, và tôi tò mò muốn biết nếu tôi chỉ có thể mương AspectJ.

Trả lời

8

Câu trả lời ngắn: Số

Như trong Java, cách duy nhất để sửa đổi một lớp là mở rộng (phân lớp). Bạn có thể mở rộng Shape và ghi đè phương thức draw (giả sử draw không được khai báo là final). Trong Clojure, điều này có thể được thực hiện với proxy hoặc gen-class.

+0

Ok, cảm ơn. Tôi biết về 'proxy' và' gen-class', tôi chỉ muốn chắc chắn rằng phương pháp định nghĩa lại phương pháp vẫn không có trên Clojure - tôi hi vọng rằng một số thay đổi gần đây JVM mà sự tồn tại mà tôi không biết có thể kích hoạt nó, nhưng tôi đoán Tôi sẽ phải gắn bó với AspectJ, sau đó. Cảm ơn, Stuart và Brian! – Edgar

3

Nếu bạn không thể làm điều đó trong Java, bạn không thể làm điều đó trong Clojure.

+3

Nó không giống như "nếu bạn không thể làm điều đó trong JVM, bạn không thể làm điều đó trong Clojure"? Và do đó, tôi cho rằng tôi có thể cải tổ câu hỏi của mình thành "có thể trong JVM", thay vì ở Clojure. Tôi chỉ lọc ngôn ngữ bởi vì tôi muốn biết những nỗ lực đã được thực hiện để giải quyết vấn đề này trên Clojure, cụ thể. – Edgar

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