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?
Trả lời
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());
...
This example cho biết cách triển khai giao diện Java trong ABCL.
- 1. Có thể chạy FindBugs chỉ với một lớp Java không?
- 2. Bạn có thể đọc và viết với một khách hàng Ống có tên không?
- 3. Ổ cắm Java: Tôi có thể viết một máy chủ TCP với một luồng không?
- 4. Bạn có thể gán nhiều biến cùng một lúc trong PHP như bạn có thể với Java không?
- 5. Bạn có thể viết thư cho [PC] không?
- 6. Bạn có thể gọi các lớp JRuby đã biên dịch từ java không?
- 7. Làm thế nào để bạn viết một lớp trong Javascript?
- 8. C++: Có thể kết bạn với tất cả các phiên bản của một lớp mẫu không?
- 9. Có thể viết phương thức hoán đổi trong Java không?
- 10. Trong Java, làm thế nào bạn sẽ viết tương đương với Iterable mà có thể ném ngoại lệ?
- 11. Bạn có thể phát hiện Mac Spaces trong Java không?
- 12. Bạn có thể mở rộng hai lớp học trong một lớp không?
- 13. Có thể mở rộng một lớp Java với một tên có cùng tên
- 14. Tại sao bạn không thể kế thừa từ một lớp có hàm tạo riêng tư?
- 15. Tôi có thể viết mã Java trong XCode 3.2.1 không?
- 16. Có thể biên dịch các tệp lớp với SDK Java 7 có thể chạy trên Java 6 JVM không?
- 17. Có thể viết trực tiếp chương trình với các hướng dẫn bytecode Java không?
- 18. LESS - Bạn có thể kết nối nhiều bộ chọn với nhau để lưu nhiều lớp không?
- 19. Có một Lớp Java tạo tệp POM.xml không?
- 20. Bạn có thể gọi một servlet có liên kết không?
- 21. Trong java, làm thế nào để bạn viết một java.awt.image.BufferedImage vào một tệp png 8-bit?
- 22. Bạn có thể gộp các dll lại với nhau không?
- 23. Trong Java, các lớp ẩn danh có thể mở rộng một lớp khác không?
- 24. Có thể viết một plugin VLC bằng Python không?
- 25. Bạn có thể viết ứng dụng mới cho .NET chưa?
- 26. Bạn có thể viết tắt tên danh sách? Tại sao?
- 27. Có một IndexSet và một lớp Range cho Java không?
- 28. Có thể sử dụng hai lớp java có cùng tên và cùng một gói không?
- 29. Có thể viết một bộ đa mục đích chung trong Java không?
- 30. Bạn có thể chuyển mảng int vào một phương thức chung trong java không?
ABCL là gì, nếu tôi có thể yêu cầu? –
Vũ trang gấu Common Lisp. Nó là một cài đặt Common Lisp chạy trên JVM. – compman
Đâ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