ABCLでJavaクラスを書くことはできますか?
-
24-10-2019 - |
質問
Javaクラスを作成する方法はありますか ABCL (それは別のクラスを拡張します)?
解決
ABCL自身のコンパイラが使用するコードであるJVMパッケージの関数を介して、JVAクラスをJVMバイトコードとして直接書き込むことができます。 ABCL-0.25.0の時点で、サポートされていないコードがあります Java:Jnew-runtime-Classメソッド これにより、実行のためにLISPメソッドを呼び出すJavaクラスを動的に書き込むことができます。コードは、ObjectWebのクラスを使用します ASM BCEL JVM ClassPathに存在する必要があります。 ASM BCELライブラリの正確なバージョンが必要であり、現在のABCLで動作するかどうかはテストされていません。 ABCLの問題 #153 現代のABCL実装でこれをサポートするために必要な作業を追跡します。
しかし、LISPベースの方法を使用して実装を提供する既存のJavaインターフェイスがある場合、プロセスはかなり単純です(そしてサポートされています!)
関連する関数はJava:Jinterface-Implementationであり、その使用は 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インターフェイスを実装する方法を示します。
所属していません StackOverflow