如何在Clojure中访问Java的.class?(Java互操作)
在Clojure中调用Java
load 方法并传递Class对象的正确方式 问题背景
想要在Clojure中实现这段Java代码:
manager.load("data/mytexture.png", Texture.class);
尝试了两种写法均报错:
- 写法一:
(.load "resources/bucket.png" (.class Texture))
报错信息:
Execution error (IllegalArgumentException) at bucket-drops.core/fn$fn (core.clj:79). No matching field found: class for class java.lang.Class
- 写法二:
(.load "resources/bucket.png" Texture/class)
报错信息:
Syntax error compiling at (bucket_drops/core.clj:79:19). Unable to find static field: class in class com.badlogic.gdx.graphics.Texture
正确解决方案
首先要注意Clojure调用实例方法的语法:必须把实例对象放在方法符号的前面,同时获取Java类的Class对象有两种正确方式:
方式一:使用class函数
(.load manager "resources/bucket.png" (class Texture))
方式二:直接传入类名(Clojure会自动解析为Class对象)
这是更简洁的写法:
(.load manager "resources/bucket.png" Texture)
错误原因说明
- 写法一的
(.class Texture)是错误的:Java中的.class是特殊语法,不是类的可访问字段,Clojure无法通过这种方式获取Class对象,同时你还漏掉了调用方法必需的manager实例对象。 - 写法二的
Texture/class试图访问Texture类的静态class字段,但Java中并不存在这个静态字段,.class不是普通静态成员,因此编译报错。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

