有没有办法用ABCL (扩展另一个类)创建一个Java类?
发布于 2011-01-26 18:13:28
可以通过JVM包中的函数直接编写Java类作为JVM字节码,这是ABCL自己的编译器使用的代码。从abcl-0.25.0开始,存在不支持JAVA:JNEW-RUNTIME-CLASS method的代码,该代码允许用户动态编写调用Lisp方法执行的Java类。代码使用来自JVM类路径的类,这些类必须出现在ObjectWeb类路径中。需要ASM BCEL库的确切版本,以及它是否与当前的ABCL一起工作还未经过测试。ABCL issue #153跟踪在当代ABCL实现中支持这一点所需的工作。
但是,如果您有一个现有的Java接口,并且希望使用基于Lisp的方法来为其提供实现,那么这个过程就会非常简单(并且受到支持!)
相关函数是JAVA:JINTERFACE-IMPLEMENTATION,在BankAccount example中演示了它的用法。
对于定义如下的Java接口
public interface BankAccount {
public int getBalance();
public void deposit(int amount);
public void withdraw(int amount);
}下面的Lisp代码在当前JVM中创建一个可用的Java代理:
(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)))))))要从Java中获取对此实现的引用,可以使用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());
... 发布于 2011-01-25 11:57:04
This example展示了如何在ABCL中实现Java接口。
https://stackoverflow.com/questions/4785969
复制相似问题