gpt4 book ai didi

clojure - 用 :gen-class a class that exposes its naked fields 扩展

转载 作者:行者123 更新时间:2023-12-05 02:18:36 24 4
gpt4 key购买 nike

假设有一个 Java 类没有为其所有字段提供 getter 和 setter,我必须用 :gen-class 扩展它并摆弄它们。

如何访问父类(super class)字段?

我现在想到的最快(也许是最干净...)的解决方案是创建一个扩展我的父类(super class)的 Java 类,然后扩展它,但我想知道是否有一个听起来更合适的替代方案直接。

谢谢!

最佳答案

生成类中的方法可以在 gen-class:exposes 选项的帮助下访问基类字段。 :exposes 需要一个映射,其中键是与基类字段名称匹配的符号;值也是类似 {:get getterName, :set setterName} 的映射。 Clojure 自动生成这些 getter 和 setter 方法。它们可用于读取和修改基类字段。这记录在 docstring 中对于 gen-class

此方法适用于公共(public)和 protected 领域。它不适用于私有(private)字段。

假设 Java 基类是这样的:

package fields;

class Base {
public String baseField = "base";
}

生成子类的 Clojure 代码是:

(ns fields.core
(:gen-class
:extends fields.Base
:methods [[bar [] String]
[baz [String] Object]]
:exposes { baseField { :get getField :set setField }}))

(defn -bar [this]
(str (.getField this) "-sub"))

(defn -baz [this val]
(.setField this val)
this)

(defn -main
[& args]
(println (.. (fields.core.) (bar)))
(println (.. (fields.core.) (baz "new-base") (bar))))

假设所有这些都是 AOT 编译和运行的,输出是:

base-sub
new-base-sub

关于clojure - 用 :gen-class a class that exposes its naked fields 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com