问题标签 [gen-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
401 浏览

java - 如何从 clojure 调用 gen-class 方法

我正在使用 gen-class 从我的 Clojure 代码生成 Java 类。为了使 gen-class 工作,我需要为将添加到类中的所有方法添加一个额外的第一个参数(这里称为this)。

编译后,在 Java 上下文中调用该方法可以正常工作。

但是我怎样才能直接从 Clojure 启动呢?

Thge 以下不起作用,因为缺少第一个参数。

简单地使用空的第一个参数调用函数是一种好习惯吗?

或者我应该添加一个我在内部使用的函数(例如addToString)并从将作为方法添加到类文件的函数中调用这个函数?

0 投票
3 回答
1551 浏览

java - 如何在 leiningen 中的 Clojure 代码之后编译 Java 代码

在我的 Leiningen 项目中:

我正在使用 gen-class 生成 Java 类:

我想在Java中使用:

启动lein compile会引发以下错误:

在我看来,在编译 Java 代码(此处:)期间,TestGenClassTest该类不可用。我通常做的是

  1. 注释掉那些使用 gen-class 生成类的部分(这里TestGenClass
  2. 运行lein compile(生成类文件)
  3. 然后再次输入注释掉的代码
  4. lein compile再次运行。

我肯定有更好的方法,可以让所有手动步骤变得多余。

0 投票
1 回答
1992 浏览

java - 如何使用 clojure 的 Gen 类生成静态方法?

在我的 Clojure 代码中,我想生成一个包含静态方法(名为staticMethod)的类文件,稍后在 Java 程序的静态上下文中调用该方法。

我试过(Clojure):

和(Java):

https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html我读到:

通过将元数据(通过#^{:static true})添加到方法声明中,您还可以定义静态方法。

无论我把#^{:static true}Java 编译器放在哪里,Java 编译器总是说:

无法从类型 TestGenClass 对非静态方法 staticMethod(String, String) 进行静态引用

如何在 Clojure 中定义静态方法?会#^{:static true}^:static意思一样吗?这是在哪里记录的?

0 投票
1 回答
2039 浏览

clojure - 为什么 Leiningen 不能始终正确使用我的 :gen-class?

假设我创建了一个新的 Leiningen 项目 ( lein new app example) 并在其中添加了一些代码example/src/example/core.clj,使用:gen-class

如果我然后创建一个 JAR ( lein uberjar) 并运行它,一切正常。但是,如果我尝试直接运行我的应用程序 ( lein run),我会得到一个ClassNotFoundException. 此外,如果我打开一个 REPL ( lein repl),我首先会得到与以前相同的错误,但在运行此代码之后:

错误不再出现在lein run lein repl中。

有人可以向我解释这里到底发生了什么,以及如何直接运行我的应用程序而无需从 REPL 手动编译我的代码?

编辑:在鬼混之后,我发现这个问题的解决方案是添加

project.clj. (感谢@Mars!)不过,我仍然很困惑,因为我之前尝试过简单地删除^:skip-aot,(根据文档)应该可以工作:

这将默认为 AOT 编译;要禁用此功能,请将 ^:skip-aot元数据附加到命名空间符号。

但事实并非如此。为什么?

另一个编辑(如果我应该将其中任何一个分成一个单独的问题,请告诉我,我会这样做):我一直在玩连字符 ( lein new app my-example),并且发生了奇怪的事情。这不起作用:

但这确实:

所以我的班级名称可以以小写字母 ( example.core) 开头或包含连字符 ( my-example.Core),但不能同时包含两者?我真的不明白。

最后,lein uberjar在最后一个示例上失败(使用显式:name),因为

据我所知,解决这个问题的唯一方法是将Application子类拆分为单独的命名空间。还有其他方法吗?

0 投票
1 回答
933 浏览

java - Clojure gen-class 用于重载和覆盖方法

我正在尝试使用在clojuregen-class中覆盖此类compare(WriteableComparable a, WriteableComparable b)中的方法。复杂性来自此方法重载 3 次的事实:

  • int compare(WritableComparable a, WritableComparable b)
  • int compare(Object a, Object b)
  • int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)

到目前为止,我的尝试如下所示:

一切都可以编译,但是当我运行它时,我得到一个空指针异常,我怀疑这是因为我覆盖了错误的方法(即,compare(Object a, Object b)而不是预期的compare(WritableComparable a, WritableComparable b))。作为参考Object版本compare调用通过WriteableComparable版本。

NPE 完全有可能来自其他东西,但我至少已将其范围缩小到这个 clojure 代码(当我使用相应的 Java 版本运行它时,一切正常)。

有没有办法指定应该使用哪个重载版本的方法?

(我尝试:methods在调用中添加一个子句gen-class,但我了解到应该只声明新方法,而不是超类方法。)

0 投票
1 回答
196 浏览

clojure - 如何在运行时在 clojure 中定义一个 java 类并实例化它

我尝试使用gen-and-load-classfromclojure.core然后使用自定义类加载器来调用defineClass生成的字节码,但是当我调用

我越来越

更新:

所以我按照@Elogent 的建议使用了 deftype :

在 AOT 之后,javap Foo.class我得到:

这正是我所需要的。谢谢@Elogent!

0 投票
1 回答
92 浏览

clojure - Clojure.org 关于编译和生成类的文档

  1. 我正在阅读clojure.org 上关于编译的文档,最后一部分是 gen-class 示例。我做了示例,然后在尝试将其作为 java 应用程序运行时:java -cp ./classes:clojure.jar clojure.examples.hello Fred在终端中我得到 : Error: Could not find or load main class clojure.examples.hello。有人可以帮忙吗?

  2. 有人可以介绍在哪里了解 gen-class 和 :gen-class,我在网上找不到太多文档

0 投票
0 回答
324 浏览

java - Lein install/uberjar 在尝试使用依赖项与 gen-class 时失败

当我使用来自二阶依赖项的类时获取 ClassNotFoundException。当我运行 lein uberjar 或安装时失败

但是,它会被编译。

我的 project.clj 文件(选定部分)

移植器:0.7.0 使用 incanter.core.Dataset。

我使用它的 clojure 文件是 myproject/routes/evaluate.clj

我经历了一些gen-classaot解决方案相关的帖子。没有什么有用的。我对 Clojure 很陌生。我不完全确定发生了什么。我可以解决这个问题吗?我究竟做错了什么?

0 投票
0 回答
191 浏览

unit-testing - boot-clj:如何为使用 gen-class 生成的类构建/启动单元测试

在我的 clojure 项目中,我使用gen-class命令构建了几个 java 类。他们是[extractor.yaml YAMLExtractor YAMLExtractorFactory]。我现在想针对这些类构建单元测试,但我有错误:java.lang.ClassNotFoundException: extractor.yaml.YAMLExtractor当我运行测试时。

导致错误的文件是: yaml_extrator_factory.clj

该错误仅在测试期间发生。整个项目是 AOT 可编译的,没有错误,当我构建一个 jar 文件时也很好。

测试simple.clj包含头:

并测试哪个打印 CLASSPATH。yaml-extractor-factory没有使用。使用命令运行测试:

boot aot -a update-classpath run-test -t extractor.simple

其中任务update-classpath添加(get-env :directories)到类路径和run-test运行测试。run-test与普通的 clojure 代码一起工作正常。

运行测试是我的任务,内容如下:

0 投票
1 回答
511 浏览

java - Clojure 生成类 this 关键字

是否可以从 gen-class 方法中引用 Java 的“this”关键字?

我正在尝试在 Clojure 中实现冒失鬼的答案。但是,当我尝试在 run 函数中使用 'this' 时,我得到“java.lang.RuntimeException:无法解析符号:this in this context”。

注意:这是我第一次在 Clojure 中生成 Java 类,因此非常感谢任何一般的反馈/资源。