C'è un modo per creare una classe Java con ABCL (che estende un'altra classe)?Si può scrivere una classe Java con ABCL?
risposta
Si può scrivere direttamente scrivere una classe Java come bytecode JVM tramite le funzioni nel pacchetto JVM che è il codice utilizzato dal compilatore di ABCL. A partire da abcl-0.25.0, esiste un codice non supportato per uno JAVA:JNEW-RUNTIME-CLASS method che consente di scrivere dinamicamente una classe Java che chiama i metodi Lisp per l'esecuzione. Il codice utilizza classi dell'ObjectWeb ASM BCEL che devono essere presenti nel classpath JVM. Esattamente quale versione della libreria ASM BCEL è necessaria e se funziona con l'ABCL attuale non è stata testata. Il problema ABCL #153 tiene traccia del lavoro necessario per supportarlo nell'implementazione contemporanea di ABCL.
Ma se uno ha un'interfaccia Java esistente per il quale si vorrebbe utilizzare metodi basati Lisp per fornire un'implementazione, il processo è molto più semplice (! E sostenuto)
La relativa funzione è JAVA: JINTERFACE-ATTUAZIONE il cui uso è dimostrato nello BankAccount example.
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, si usa 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());
...
This example mostra come implementare un'interfaccia Java in ABCL.
- 1. ABCL compilazione e primitive
- 2. Cosa si può dire di questa classe java?
- 3. Come si può scrivere CoffeeScript in CoffeeScript?
- 4. Perché una classe non può estendere una classe nidificata statica che si verifica al suo interno?
- 5. Come si può creare una classe astratta e immutabile?
- 6. come scrivere una classe derivabile?
- 7. Java: una classe parent può recuperare staticamente il nome classe di una classe figlio?
- 8. Come scrivere una semplice classe in C++?
- 9. Si può confrontare gli oggetti java.lang.Class con == in Java?
- 10. Come scrivere una JVM in Java
- 11. Perché una classe Java non può essere dichiarata come statica?
- 12. Come si può scrivere funzionalmente l'algoritmo iterativo su una raccolta modificata dinamicamente con condizioni dipendenti?
- 13. Come si può accedere a "questo" della classe esterna da una classe interiore?
- 14. Come scrivere una classe UItextField personalizzata
- 15. Come scrivere una classe simile a Java-enum con più campi di dati in C++?
- 16. Una classe può estendere sia una classe che implementare un'interfaccia
- 17. Come si può aggiungere una variabile di classe a una classe in Pharo?
- 18. Perché una classe super può essere inizializzata come classe figlio in Java?
- 19. Una chiusura Groovy può estendere una classe astratta
- 20. a cosa serve scrivere una classe all'interno di un'interfaccia
- 21. Si può inizializzare una stringa Java con un singolo carattere ripetuto ad una specifica lunghezza
- 22. scrivere C# implementazione della classe astratta inline?
- 23. Come si può scrivere JSON raw attraverso JsonGenerator di Jackson?
- 24. Come si può modificare un documento word con Java
- 25. Come utilizzare una classe Java nello scriptlet JSP? Errore dice che la classe non può essere risolta con un tipo
- 26. Quando si dovrebbe usare una classe locale in Java?
- 27. Come si può determinare se esiste una classe css con Javascript?
- 28. Android BLE: non può scrivere una caratteristica (senza PROPERTY_WRITE)
- 29. jsp: param con classe Java
- 30. Can __setattr __() può essere definito in una classe con __slots__?
Che cos'è ABCL, se posso chiedere? –
Lisp dell'orso armata. È un'implementazione Common Lisp eseguita su JVM. – compman
Questo non è esattamente quello che ho chiesto, ma fa quello che voglio fare. [Questo URL] (http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI) ha una sezione "Implementazione delle interfacce Java". È possibile (in Lisp) creare oggetti Java che implementano interfacce Java. – compman