You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中无Java类实例时如何获取对应.class对象用于反射

Clojure中获取Java类Class对象的正确实现

Java中类名.class的语义是获取该类对应的java.lang.Class实例,在Clojure中不需要额外调用方法获取,导入类后直接使用类名即可,类名符号本身求值后就是对应的Class对象。

两种错误写法的原因

  • (.class SampleClass):错误将Java的类字面量语法.class当做Clojure的成员调用语法。Clojure的点运算符互操作是用来调用实例方法/访问实例字段的,class并不是Class类的可调用成员,因此无法生效。
  • (.getClass SampleClass):getClass()是java.lang.Object的实例方法,必须由类的实例对象调用,无实例时直接调用不符合该方法的使用规则,自然拿不到预期结果。

正确实现代码

对应给出的Java反射示例,Clojure等价写法如下:

  1. 先导入依赖类
(import 'com.example.SampleClass
        'java.lang.reflect.Field)
  1. 调用反射方法获取字段对象
;; 直接写导入后的类名SampleClass,等价于Java中的SampleClass.class
(def field (.getDeclaredField SampleClass "someFiledName"))

如果是类名需要动态传入、不提前导入的场景,也可以使用Class/forName动态加载类,效果完全一致:

(def field (.getDeclaredField (Class/forName "com.example.SampleClass") "someFiledName"))

注意:Class/forName方法需要传入类的全限定名字符串,适合动态场景使用;固定类的场景下优先使用提前import后直接写类名的方式,代码更简洁,类加载性能也更好。

内容的提问来源于stack exchange,提问作者Tsunaou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:45:43