1

gen-and-load-classfromを使用してからclojure.coreカスタムクラスローダーを使用しdefineClassて、生成されたバイトコードで呼び出しようとしましたが、呼び出すと

(foo.bar.MyClass.)

私は得ています

CompilerExceptionjava.lang.NoClassDefFoundError: Could not initialize class foo.bar.MyClass

アップデート:

だから私は @Elogent によって提案されたように deftype を使用しました:

(defprotocol Struct
  (getX [this path] "Get value")
  (setX [this ^long value path] "Get value"))
(deftype Foo 
  [
  ^{:tag long :unsynchronized-mutable true} a 
  ^{:tag long :unsynchronized-mutable true} b 
  ^{:tag long :unsynchronized-mutable true} c]
  Struct
  (getX
    [this [head & tail]]
    (let [field (condp = head
          'a a
          'b b
          'c c)]
      (if (empty? tail)
        field
        (getX field tail))))
  (setX
    [this value [head & tail]]

    (if (empty? tail)
        (condp = head
          (set! a (long value))
          (set! b (long value))
          (set! c (long value)))
        (condp = head
          (setX a value tail)
          (setX b value tail)
          (setX c value tail)))))

私がしたときのAOTの後、私はjavap Foo.class得ました:

public final class struct.core.Foo implements struct.core.Struct,clojure.lang.IType {
  public static final clojure.lang.Var const__0;
  public static final java.lang.Object const__1;
  public static final clojure.lang.Var const__2;
  public static final java.lang.Object const__3;
  public static final clojure.lang.Var const__4;
  public static final clojure.lang.AFn const__5;
  public static final clojure.lang.AFn const__6;
  public static final clojure.lang.AFn const__7;
  public static final clojure.lang.Var const__8;
  public static final clojure.lang.Var const__9;
  public static final clojure.lang.Var const__10;
  public static final clojure.lang.Var const__11;
  public static final clojure.lang.Var const__12;
  long a;
  long b;
  long c;
  public static {};
  public struct.core.Foo(long, long, long);
  public static clojure.lang.IPersistentVector getBasis();
  public java.lang.Object setX(java.lang.Object, java.lang.Object);
  public java.lang.Object getX(java.lang.Object);
}

これはまさに私が必要とするものです。ありがとう@Elogent!

4

1 に答える 1

1

Java クラスのすべての柔軟性が絶対に必要でない限り、deftype代わりに Java クラスを使用することをお勧めします。hereで説明されているdeftypeように、プリミティブ型や可変性などの下位レベルの構成要素に慣用的な方法でアクセスできます。

于 2015-11-04T11:53:50.047 に答える