2011-01-24 32 views
5

Có cách nào để tạo một lớp Java với ABCL (mở rộng một lớp khác) không?Bạn có thể viết một lớp Java với ABCL không?

+1

ABCL là gì, nếu tôi có thể yêu cầu? –

+1

Vũ trang gấu Common Lisp. Nó là một cài đặt Common Lisp chạy trên JVM. – compman

+0

Đây không phải là những gì tôi hỏi, nhưng nó làm những gì tôi muốn làm. [URL này] (http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI) có phần "Thực hiện các giao diện Java". Bạn có thể (trong Lisp) tạo các đối tượng Java thực hiện các giao diện Java. – compman

Trả lời

5

Người ta có thể viết trực tiếp viết một lớp Java là bytecode JVM qua các hàm trong gói JVM là mã mà trình biên dịch riêng của ABCL sử dụng. Kể từ abcl-0.25.0, có mã không được hỗ trợ cho một số JAVA:JNEW-RUNTIME-CLASS method cho phép người dùng tự động viết một lớp Java gọi các phương thức Lisp để thực thi. Mã này sử dụng các lớp từ ObjectWeb ASM BCEL phải có mặt trong đường dẫn lớp JVM. Chính xác phiên bản nào của thư viện ASM BCEL là cần thiết, và liệu nó có hoạt động với ABCL hiện tại chưa được kiểm tra hay không. Sự cố ABCL #153 theo dõi công việc cần thiết để hỗ trợ việc này trong triển khai ABCL hiện đại.

Nhưng nếu một người có một giao diện Java hiện tại cho cái nào muốn sử dụng phương pháp Lisp dựa để cung cấp một thực hiện, quá trình này đơn giản hơn đáng kể (! Và được hỗ trợ)

Chức năng có liên quan là JAVA: JINTERFACE-THỰC HIỆN có sử dụng được thể hiện trong BankAccount example.

Đối với các giao diện Java định nghĩa là

public interface BankAccount { 
    public int getBalance(); 
    public void deposit(int amount); 
    public void withdraw(int amount); 
} 

Mã Lisp sau tạo một thể sử dụng Java Proxy trong JVM hiện tại:

(defparameter *bank-account-impl* 
    (let ((balance 1000)) 
    (jinterface-implementation 
    "BankAccount" 

    "getBalance" 
     (lambda() 
     balance) 
    "deposit" 
     (lambda (amount) 
     (let ((amount (jobject-lisp-value amount))) 
      (setf balance (+ balance amount)))) 
    "withdraw" 
     (lambda (amount) 
     (let ((amount (jobject-lisp-value amount))) 
      (setf balance (- balance amount))))))) 

Để có được một tài liệu tham khảo để thực hiện điều này từ Java, một sử dụng mã trong BankMainAccount.java

... 
    org.armedbear.lisp.Package defaultPackage 
    = Packages.findPackage("CL-USER"); 
    Symbol bankAccountImplSymbol 
    = defaultPackage.findAccessibleSymbol("*BANK-ACCOUNT-IMPL*"); 
    LispObject value = bankAccountImplSymbol.symbolValue(); 
    Object object = ((JavaObject) value).getObject(); 
    BankAccount account = (BankAccount) object; 
    System.out.println("Initial balance: " + account.getBalance()); 
    account.withdraw(500); 
    System.out.println("After withdrawing 500: " + account.getBalance()); 
    ... 
0

This example cho biết cách triển khai giao diện Java trong ABCL.

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