Pregunta

Es allí una manera de crear una clase Java con ABCL (que se extiende de otra clase)?

¿Fue útil?

Solución

Uno puede escribir directamente escribir una clase Java como JVM código de bytes a través de las funciones en la JVM paquete que es el código que ABCL del propio compilador utiliza.Como de abcl-0.25.0, no es compatible con el código de una JAVA:JNEW-tiempo de ejecución-método de CLASE que permite de forma dinámica escribir una clase Java que se llama Lisp métodos para su ejecución.El código utiliza las clases de la ObjectWeb ASM BCEL que deben estar presentes en el classpath de JVM.Exactamente que versión de la ASM BCEL de la biblioteca es necesario, y si funciona con el actual ABCL no está probado.ABCL problema #153 las pistas de los trabajos necesarios para apoyar esto en el contemporáneo ABCL aplicación.

Pero si uno tiene una interfaz Java para que a uno le gustaría utilizar Lisp basados en los métodos para proporcionar una implementación, el proceso es bastante más sencillo (y de apoyo!)

La función relevante es JAVA:JINTERFACE-APLICACIÓN cuyo uso se muestra en el BankAccount ejemplo.

Para la interfaz Java define como

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

El siguiente código Lisp crea un utilizable Proxy de Java en el actual 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)))))))

Para obtener una referencia a esta implementación de Java, se utiliza el código de 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());
  ... 

Otros consejos

Este ejemplo Muestra cómo implementar una interfaz Java en ABCL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top