Domanda

C'è un modo per creare una classe Java con ABCL (che si estende un'altra classe) ?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top