質問

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インターフェイスを実装する方法を示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top