Si può scrivere una classe Java con ABCL?
-
24-10-2019 - |
Domanda
C'è un modo per creare una classe Java con ABCL (che si estende un'altra classe) ?
Soluzione
Si può scrivere direttamente scrivere una classe Java come JVM bytecode tramite le funzioni nel pacchetto JVM che è il codice che usi propri del compilatore di ABCL. Al ABCL-0.25.0, c'è codice supportato per un JAVA: metodo JNEW-DURATA-cLASS che permette di scrivere in modo dinamico una classe Java che chiama i metodi Lisp per l'esecuzione. Le classi utilizza il codice dalla ObjectWeb ASM BCEL che deve essere presente nel percorso di classe JVM. Esattamente cui è necessario versione della libreria ASM BCEL, e se funziona con la corrente ABCL è testato. problema ABCL # 153 tiene traccia del lavoro necessario a sostegno di questa nell'attuazione ABCL contemporanea .
Ma se uno ha un'interfaccia Java esistente per il quale si vorrebbe usare Lisp metodi basati per fornire un'implementazione, il processo è molto più semplice (e sostenuto!)
La relativa funzione è JAVA: JINTERFACE-ATTUAZIONE il cui uso è dimostrata nel BankAccount esempio .
Per l'interfaccia Java definito come
public interface BankAccount {
public int getBalance();
public void deposit(int amount);
public void withdraw(int amount);
}
Il seguente codice Lisp crea una utilizzabile Java Proxy nella JVM corrente:
(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)))))))
Per ottenere un riferimento a questa implementazione da Java, uno utilizza il codice in 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());
...
Altri suggerimenti
Questo esempio mostra come implementare interfaccia Java in ABCL.