2011-01-24 11 views
5

C'è un modo per creare una classe Java con ABCL (che estende un'altra classe)?Si può scrivere una classe Java con ABCL?

+1

Che cos'è ABCL, se posso chiedere? –

+1

Lisp dell'orso armata. È un'implementazione Common Lisp eseguita su JVM. – compman

+0

Questo non è esattamente quello che ho chiesto, ma fa quello che voglio fare. [Questo URL] (http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI) ha una sezione "Implementazione delle interfacce Java". È possibile (in Lisp) creare oggetti Java che implementano interfacce Java. – compman

risposta

5

Si può scrivere direttamente scrivere una classe Java come bytecode JVM tramite le funzioni nel pacchetto JVM che è il codice utilizzato dal compilatore di ABCL. A partire da abcl-0.25.0, esiste un codice non supportato per uno JAVA:JNEW-RUNTIME-CLASS method che consente di scrivere dinamicamente una classe Java che chiama i metodi Lisp per l'esecuzione. Il codice utilizza classi dell'ObjectWeb ASM BCEL che devono essere presenti nel classpath JVM. Esattamente quale versione della libreria ASM BCEL è necessaria e se funziona con l'ABCL attuale non è stata testata. Il problema ABCL #153 tiene traccia del lavoro necessario per supportarlo nell'implementazione contemporanea di ABCL.

Ma se uno ha un'interfaccia Java esistente per il quale si vorrebbe utilizzare metodi basati Lisp per fornire un'implementazione, il processo è molto più semplice (! E sostenuto)

La relativa funzione è JAVA: JINTERFACE-ATTUAZIONE il cui uso è dimostrato nello BankAccount example.

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, si usa 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()); 
    ... 
0

This example mostra come implementare un'interfaccia Java in ABCL.

Problemi correlati