¿Hay alguna manera de crear una clase Java con ABCL (que amplía otra clase)?¿Puedes escribir una clase de Java con ABCL?
Respuesta
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());
...
This example muestra cómo implementar una interfaz Java en ABCL.
- 1. ¿Puedes escribir en [PC]?
- 2. Compilación ABCL y primitivas
- 3. ¿Puedes extender dos clases en una clase?
- 4. ¿Cómo escribir una clase segura con contraseña?
- 5. ¿Qué patrones puedes usar con la herencia de prototipos que no puedes con la clase?
- 6. ¿Puedes escribir una redirección 301 a un punto de anclaje?
- 7. ¿Por qué no puedes escribir una expresión de función?
- 8. ¿Puedes escribir funciones anidadas en JavaScript?
- 9. ¿Cómo escribir una fuente RSS con Java?
- 10. Escribir archivo HTML con Java
- 11. ¿Puedes detectar espacios de Mac en Java?
- 12. ¿De qué sirve escribir una clase dentro de una interfaz?
- 13. Cómo escribir una clase capaz de foreach
- 14. ¿Cómo escribir una clase simple en C++?
- 15. ¿Puedes leer y escribir con un único cliente de Named Pipe?
- 16. ¿Puedes anular un constructor de clase y usar heredado?
- 17. ¿Puedes llamar a las clases JRuby compiladas desde Java?
- 18. ¿Puedes comenzar un proceso externo con Silverlight?
- 19. ¿Qué unidad de prueba escribir para una clase usando genéricos en Java?
- 20. Java dinámicamente Cargando una clase
- 21. ¿Cómo manejar una clase Java con cientos de campos?
- 22. Clase abstracta de Java Implementar una interfaz con genéricos
- 23. En .NET, ¿puedes usar el reflejo para obtener todos los métodos no heredados de una clase?
- 24. ¿Puedes hidratar una propiedad estática usando MEF?
- 25. Metodología de interfaces Java: ¿Debería cada clase implementar una interfaz?
- 26. Referencia de clase para una clase interna Java
- 27. ¿Cómo escribir el método de descripción adecuado para una clase?
- 28. escribir una clase sub de parcelable a otro paquete
- 29. Tenemos una clase de clase TimeSpan en Java
- 30. Clase de Java getResource() con eclipse
¿Qué es ABCL, si puedo preguntar? –
Armed Bear Common Lisp. Es una implementación de Common Lisp que se ejecuta en la JVM. – compman
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