Можете ли вы написать класс Java с ABCL? - PullRequest
5 голосов
/ 24 января 2011

Есть ли способ создать класс Java с помощью ABCL (который расширяет другой класс)?

Ответы [ 2 ]

5 голосов
/ 26 января 2011

Можно напрямую написать класс Java в виде байт-кода JVM с помощью функций в пакете JVM, который является кодом, который использует собственный компилятор ABCL. Начиная с abcl-0.25.0, существует неподдерживаемый код для JAVA: JNEW-RUNTIME-CLASS , который позволяет динамически писать класс Java, который вызывает методы Lisp для выполнения. В коде используются классы из ObjectWeb ASM BCEL , которые должны присутствовать в пути к классам JVM. Какая именно версия библиотеки ASM BCEL необходима и работает ли она с текущим ABCL, не проверено. Выпуск ABCL # 153 отслеживает работу, необходимую для поддержки этого в современной реализации ABCL.

Но если у вас есть существующий интерфейс Java, для которого вы хотите использовать методы на основе Lisp для обеспечения реализации, процесс значительно упрощается (и поддерживается!)

Соответствующей функцией является JAVA: JINTERFACE-IMPLEMENTATION, использование которой продемонстрировано в примере BankAccount .

Для интерфейса Java, определенного как

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

Следующий код на Лиспе создает используемый прокси-сервер Java в текущей JVM:

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

Чтобы получить ссылку на эту реализацию из Java, используйте код в 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 голосов
/ 25 января 2011

В этом примере показано, как реализовать интерфейс Java в ABCL.

...