java - Common Lisp 中的类自省(introspection)

标签 java reflection lisp common-lisp introspection

Java 的 java.lang.Class 类有一个 getDeclaredFields 方法,它将返回给定类中的所有字段。 Common Lisp有类似的东西吗?在阅读了 Successful Lisp, Chapter 10 ( http://www.psg.com/~dlamkins/sl/chapter10.html) 中尝试说明后,我遇到了一些有用的函数,例如 describe、inspect 和 symbol-plist。但是它们都没有执行 getDeclaredFields 所做的事情。

最佳答案

您应该使用类槽和/或类直接槽(均来自 CLOS 元对象协议(protocol),MOP)。 class-slots 返回给定类中存在的所有插槽,class-direct-slots 返回所有在类定义中声明的插槽。

不同的 lisp 实现对 MOP 的实现略有不同;使用 closer-mop包具有与 MOP 的统一接口(interface)。

例子:

(defclass foo ()
  (foo-x))

(finalize-inheritance (find-class 'foo)) ;this is needed to be able to query class slots and other properties. Or, class is automatically finalized when its first instance is created

(class-slots (find-class 'foo))
=> (#<STANDARD-EFFECTIVE-SLOT-DEFINITION FOO-X>)

(slot-definition-name (first (class-slots (find-class 'foo))))
=> FOO-X

示例:

(defun inspect (( object standard-object))
  (inspect-rec (class-slots (class-of object)) object) )


(defun inspect-rec (slots o)
  ( if(atom slots) ()
   (let ((sn (slot-definition-name (car slots)))) (cons (list sn '=> ( slot-value o sn) )  ( inspect-rec (cdr slots) o)))))

关于java - Common Lisp 中的类自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742154/

相关文章:

java - 使用 Java 上传 Onedrive API 文件

scala - 在 Scala 中使用反射的奇怪行为

c# - 断言子类调用的特定构造函数

lisp - 语法从 'The Little Schemer' 中的示例更改为真实的 Scheme

java - 如何在gwt的TabPanel中添加网页?

java - 如何实现根据用户选择返回类型的Java函数?

java - Java中如何将一维数组转换为二维数组

Java 获取 java.lang.Number 或原语的通用子类的 valueOf

lisp - ASDF 输出重定向

lisp - 成员函数在 cons 结构中不起作用