有没有办法与 ABCL (扩展了另一个类)?

有帮助吗?

解决方案

可以通过JVM软件包中的函数直接编写JAVA类作为JVM字节码,该功能是ABCL自己的编译器使用的代码。截至ABCL-0.25.0,有未支撑的代码 Java:Jnew-Runtime-Class方法 这允许一个人动态编写Java类,该类调用LISP方法进行执行。该代码使用ObjectWeb的类 ASM Bcel 必须存在于JVM Class Path中。确切需要哪个版本的ASM BCEL库,以及是否与当前ABCL一起使用。 ABCL问题 #153 跟踪在当代ABCL实施中为此提供必要的工作。

但是,如果一个人希望使用基于LISP的方法提供实现的现有Java界面,则该过程非常简单(并且支持!)!

相关功能是Java:Jinterface-Implentation,其用途已在 BankAccount示例.

对于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());
  ... 

其他提示

这个示例 显示如何在ABCL中实现Java接口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top