问题标签 [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.
java - 如何从 clojure 调用 gen-class 方法
我正在使用 gen-class 从我的 Clojure 代码生成 Java 类。为了使 gen-class 工作,我需要为将添加到类中的所有方法添加一个额外的第一个参数(这里称为this
)。
编译后,在 Java 上下文中调用该方法可以正常工作。
但是我怎样才能直接从 Clojure 启动呢?
Thge 以下不起作用,因为缺少第一个参数。
简单地使用空的第一个参数调用函数是一种好习惯吗?
或者我应该添加一个我在内部使用的函数(例如addToString
)并从将作为方法添加到类文件的函数中调用这个函数?
java - 如何在 leiningen 中的 Clojure 代码之后编译 Java 代码
在我的 Leiningen 项目中:
我正在使用 gen-class 生成 Java 类:
我想在Java中使用:
启动lein compile
会引发以下错误:
在我看来,在编译 Java 代码(此处:)期间,TestGenClassTest
该类不可用。我通常做的是
- 注释掉那些使用 gen-class 生成类的部分(这里
TestGenClass
) - 运行
lein compile
(生成类文件) - 然后再次输入注释掉的代码
- 并
lein compile
再次运行。
我肯定有更好的方法,可以让所有手动步骤变得多余。
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
意思一样吗?这是在哪里记录的?
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
子类拆分为单独的命名空间。还有其他方法吗?
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
,但我了解到应该只声明新方法,而不是超类方法。)
clojure - 如何在运行时在 clojure 中定义一个 java 类并实例化它
我尝试使用gen-and-load-class
fromclojure.core
然后使用自定义类加载器来调用defineClass
生成的字节码,但是当我调用
我越来越
更新:
所以我按照@Elogent 的建议使用了 deftype :
在 AOT 之后,javap Foo.class
我得到:
这正是我所需要的。谢谢@Elogent!
clojure - Clojure.org 关于编译和生成类的文档
我正在阅读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
。有人可以帮忙吗?有人可以介绍在哪里了解 gen-class 和 :gen-class,我在网上找不到太多文档
java - Lein install/uberjar 在尝试使用依赖项与 gen-class 时失败
当我使用来自二阶依赖项的类时获取 ClassNotFoundException。当我运行 lein uberjar 或安装时失败
但是,它会被编译。
我的 project.clj 文件(选定部分)
移植器:0.7.0 使用 incanter.core.Dataset。
我使用它的 clojure 文件是 myproject/routes/evaluate.clj
我经历了一些gen-class
与aot
解决方案相关的帖子。没有什么有用的。我对 Clojure 很陌生。我不完全确定发生了什么。我可以解决这个问题吗?我究竟做错了什么?
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 代码一起工作正常。
运行测试是我的任务,内容如下:
java - Clojure 生成类 this 关键字
是否可以从 gen-class 方法中引用 Java 的“this”关键字?
我正在尝试在 Clojure 中实现冒失鬼的答案。但是,当我尝试在 run 函数中使用 'this' 时,我得到“java.lang.RuntimeException:无法解析符号:this in this context”。
注意:这是我第一次在 Clojure 中生成 Java 类,因此非常感谢任何一般的反馈/资源。