Question

Est-il possible de créer une classe Java avec ABCL (qui étend une autre classe) ?

Était-ce utile?

La solution

On peut écrire directement écrire une classe Java bytecode JVM via les fonctions dans le package JVM qui est le code qui propres utilisations du compilateur de ABCL. A partir de ABCL-0.25.0, il y a un code non pris en charge pour une JAVA: méthode Jnew-RUNTIME-cLASS qui permet d'écrire un dynamiquement une classe Java qui appelle des méthodes Lisp pour l'exécution. Le code utilise des classes de la ObjectWeb ASM BCEL qui doit être présente dans la machine virtuelle Java classpath. Quelle version de la bibliothèque ASM BCEL est nécessaire, et si cela fonctionne avec le ABCL actuel est non testé. question ABCL # 153 suit les travaux nécessaires pour soutenir ce dans la mise en œuvre de ABCL contemporaine .

Mais si l'on dispose d'une interface Java existant pour lequel on voudrait utiliser des méthodes basées Lisp pour fournir une mise en œuvre, le processus est beaucoup plus simple (et pris en charge!)

La fonction correspondante est JAVA: JINTERFACE-APPLICATION dont l'utilisation est démontrée dans le BankAccount exemple .

Pour l'interface Java définie comme

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

Le code Lisp suivant crée un proxy Java utilisable dans la machine virtuelle Java actuelle:

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

Pour obtenir une référence à cette implémentation de Java, on utilise le code dans 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());
  ... 
scroll top