2011-01-24 7 views
5

ABCL(別のクラスを拡張)でJavaクラスを作成する方法はありますか?ABCLでJavaクラスを作成できますか?

+1

私が聞くことができるのは、ABCLとは何ですか? –

+1

アルマベアコモンLisp。これは、JVM上で動作するCommon Lisp実装です。 – compman

+0

これは私が尋ねたこととまったく同じことではありませんが、私がしたいことをします。 [このURL](http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI)には、「Javaインターフェイスの実装」セクションがあります。あなたは(Lispで)Javaインタフェースを実装するJavaオブジェクトを作成できます。 – compman

答えて

5

JVMパッケージ内の関数(ABCL独自のコンパイラが使用するコード)を使用して、Javaクラスを直接JVMバイトコードとして書き込むことができます。 abcl-0.25.0から、JAVA:JNEW-RUNTIME-CLASS methodのためのサポートされていないコードがあります。これは、実行のためにLispメソッドを呼び出すJavaクラスを動的に書くことを可能にします。このコードでは、ObjectWeb ASM BCELのクラスを使用します。このクラスは、JVMクラスパスに存在する必要があります。 ASM BCELライブラリーの正確なバージョンが必要であり、現在のABCLと連動するかどうかは検査されません。 ABCLの問題#153は、現代のABCL実装でこれをサポートするのに必要な作業を追跡します。 (!とサポート)

しかし、一つ一つの実装を提供するためのLispベースの方法を使用したい対象の既存のJavaインターフェースを持っている場合、プロセスはかなり簡単である

関連の機能はJAVAです:JINTERFACE-実装その使用はBankAccount exampleに示されています。 Javaインターフェースについて

次のLispコードは、現在のJVMに使用可能なJavaプロキシを作成

public interface BankAccount { 
    public int getBalance(); 
    public void deposit(int amount); 
    public void withdraw(int amount); 
} 

として定義:

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

This exampleは、ABCLでJavaインターフェイスを実装する方法を示しています。

関連する問題