From: <as...@ma...> - 2004-01-06 16:51:09
|
The class generator stuff is in cvs now. (But it may take a few days before it's available in anon cvs.) Here's how it's used: (java:jnew-runtime-class "Test" "javax.swing.table.AbstractTableModel" `(("getColumnCount" "int" nil ,#'(lambda () (format t "getColumnCount~%") 42)) ("getRowCount" "int" nil ,#'(lambda () (format t "getRowCount~%") 13)) ("getColumnName" "java.lang.String" ("int") ,#'(lambda (i) (format nil "getColumnName: ~d" i))) ("getValueAt" "java.lang.Object" ("int" "int") ,#'(lambda (i j) (format nil "getColumnCount: ~d, ~d" i j))) ("doStringString" "java.lang.String" ("java.lang.String") ,#'(lambda (s) (format nil "getColumnCount: ~s" s))) ("doArray" "java.lang.String[]" ("int[]" "long[]" "java.lang.String[]") ,#'(lambda (a b c) (format t "doArray: ~s" (jarray-ref c 1)) (setf (jarray-ref c 1) "changed") c)) ("dobb" "boolean" ("boolean") ,#'(lambda (b) (format t "dobb: ~s~%" b) (not b))) ("dob_" "void" ("boolean") ,#'(lambda (b) (format t "dob_: ~s~%" b) )) ("do_b" "boolean" () ,#'(lambda () (format t "do_b:~%")(make-immediate-object t :boolean))))) Classes created this way can be used like other Java classes: (jcall (jmethod "Test" "dobb" "boolean") (jnew (jconstructor "Test")) (make-immediate-object t :boolean)) (jcall (jmethod "Test" "doArray" "[I" "[J" "[Ljava.lang.String;") (jnew (jconstructor "Test")) (jnew-array-from-array "int" #(0 1 2)) (jnew-array-from-array "long" #(0 1 2)) (jnew-array-from-array "java.lang.String" #("a" "b" "c"))) (Note the funny syntax for arrays; we inherited this from jlinker, but I'm going to do sth about it.) Methods can be redefined like this: (java:jredefine-method "Test" "doArray" '("int[]" "long[]" "java.lang.String[]") #'(lambda (a b c) (format t "modified doArray: ~s" (jarray-ref c 1)) (setf (jarray-ref c 1) "changed") c)) Finally, there's JAVA:JRUNTIME-CLASS-EXISTS-P to see if a runtime class has been defined/loaded. As always, comments are welcome. Andras |
From: <as...@ma...> - 2004-01-07 16:36:01
|
I forgot to mention that asm.jar (http:/asm.objectweb.org) must be in ABL's CLASSPATH for all this to work. Also, there's a user-visible change since yesterday's version: the Lisp method definitions have an extra argument (the last one) where the instance (`this') is passed in. Andras |