ABCL(別のクラスを拡張)でJavaクラスを作成する方法はありますか?ABCLでJavaクラスを作成できますか?
5
A
答えて
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インターフェイスを実装する方法を示しています。
私が聞くことができるのは、ABCLとは何ですか? –
アルマベアコモンLisp。これは、JVM上で動作するCommon Lisp実装です。 – compman
これは私が尋ねたこととまったく同じことではありませんが、私がしたいことをします。 [このURL](http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI)には、「Javaインターフェイスの実装」セクションがあります。あなたは(Lispで)Javaインタフェースを実装するJavaオブジェクトを作成できます。 – compman