我正在尝试用Java创建模块化结构,其中:
在node.js中,我只需要执行module.exports
并要求从另一个文件中使用它即可,但是在Java中,看起来好像没有办法在不编译的情况下运行一段代码。
理想情况下,我想创建一个系统,其中这些模块是即插即用的,就像我可以将文件放在node.js中的目录中并立即需要并使用而没有任何麻烦一样。 Java文件也不能编译为类文件,因为我希望源代码可见。
有这种方法吗?
答案 0 :(得分:1)
你说
我如何将文件放置在node.js中的目录中,并立即要求和使用而没有任何麻烦。 Java文件也不能编译为类文件,因为我希望源代码可见
您的目标尚不完全清楚。编译完代码(可能放在罐子中)之后,如果您希望源代码对程序员可见,请使用像IntelliJ这样的IDE来动态地反编译类,并且您可以导航源代码而无需任何其他反编译步骤
谈到主要问题,如@Mark Rotteveel所说,Don't try to shoehorn Java into something it is not
。编译为Java提供了Platform-Independence
。
您可以在此处查看Java编译背后的原因和优势 How Java Works
答案 1 :(得分:1)
其他人都说过,但这可能不是最好的主意。您可能会尝试将已经知道的一种语言变成一种新语言,而不考虑该新语言实际上可以做什么和不能做什么。
话虽如此,当然,有两种方法可以做您想要的事情:
为您的部分或全部工作而不是Java写Groovy。 Groovy与Java有99%的兼容性:在大多数情况下,您可以将.java文件重命名为.groovy,并且它们在语法上应无效。在Groovy中,您应该能够动态加载文件并执行它们。
您还可以在主Java程序中执行Groovy。因此,用Java编写您的主程序,然后调用特殊的Groovy Development Kit类,即可在此处编译您的类。实际上,Jenkins几乎将这件事完全使用Groovy作为脚本语言!
使用Java编写主程序,但使用Java ScriptEngineManager调用其他语言的其他代码。实际上,使用此概念可以使您从实际的 Javascript 调用Java类。这可能超级有用,具体取决于您要执行的操作。只需将主程序编译为Java。
执行第1项,只是选择与Java语法不太兼容的语言。我怀疑Kotlin可能具有一些功能来动态加载文件。
您实际上可能正在尝试用Java构建插件架构。我怀疑至少有一些关于此主题的博客条目。这可能需要对插件进行编译,但是如果操作正确,则主程序将不会对特定插件有任何依赖关系。同样,这可能是一个选项,具体取决于您要去的地方(尝试构建自己的Minecraft或Photoshop?)
答案 2 :(得分:0)
其他答案中已经列出了许多不错的选择(和警告)。
另一种选择:编写一个聪明的Java main,拾取源文件,透明地编译它们(如果愿意,在用户的后面):)并将结果加载到当前的JVM中。官方方式将通过JSR 199。
Eclipse调试器是此类即时编译和执行的一个很好的例子。用户选择一个代码片段并检查其评估的值。没有人注意到该代码段是在后台进行编译的(除非您有编译错误,即)。 JSP遵循类似的路径等。