2011-01-24 10 views
5

¿Hay alguna manera de crear una clase Java con ABCL (que amplía otra clase)?¿Puedes escribir una clase de Java con ABCL?

+1

¿Qué es ABCL, si puedo preguntar? –

+1

Armed Bear Common Lisp. Es una implementación de Common Lisp que se ejecuta en la JVM. – compman

+0

Esto no es exactamente lo que pregunté, pero hace lo que quiero hacer. [Esta URL] (http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI) tiene una sección de "Implementación de interfaces Java". Puede (en Lisp) crear objetos Java que implementen interfaces Java. – compman

Respuesta

5

Se puede escribir directamente escribir una clase Java como bytecode JVM a través de las funciones en el paquete JVM que es el código que utiliza el propio compilador de ABCL. A partir de abcl-0.25.0, existe un código no compatible para JAVA:JNEW-RUNTIME-CLASS method que permite escribir dinámicamente una clase Java que llama a los métodos Lisp para su ejecución. El código usa clases de ObjectWeb ASM BCEL que deben estar presentes en el classpath JVM. Exactamente qué versión de la biblioteca ASM BCEL es necesaria y si funciona con el ABCL actual no se ha probado. El número #153 de ABCL realiza un seguimiento del trabajo necesario para respaldar esto en la implementación de ABCL contemporánea.

Pero si uno tiene una interfaz Java existente para los que a uno le gustaría utilizar métodos basados ​​en Lisp para proporcionar una implementación, el proceso es considerablemente más simple (! Y apoyado)

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

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 proxy de Java utilizable en la JVM actual:

(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 aplicación de Java, uno usos el código en 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 muestra cómo implementar una interfaz Java en ABCL.

Cuestiones relacionadas