由于尚不确定Java上的JS的未来(在Java 11上已弃用JS / Nashorn),我一直在研究完全不在JS之外的选项,因为Groovy与Java相似且颇受欢迎,因此是主要的选择。
我目前正在使用JS / Nasahorn处理游戏服务器上的许多操作,尽管我可以看到很多可以转换为Groovy,但我确实担心如果可能的话我会遇到麻烦是否。
因此,在我的游戏服务器上,一直有新的可单击的地图对象和npc被添加(每个数以万计)。为了处理这些点击事件,我有JS类来处理它们。
要添加一个新的对象或npc动作,我有一组JS文件将ID分开,以使其不是一个巨大的文件。具体来说,我使用JS原型能够添加这些动作而无需使用相同的文件,而只是在运行时加载所有JS文件。
ObjectOption.prototype.object_0 = function(player, object) { }
然后我可以通过
从实际的JS类本身执行功能ObjectOption.prototype["object_" + object.getID()](player, object);
或
this["object_" + object.getID()](player, object);
我的问题是,可以使用Groovy进行任何此类设置,还是超出Groovy的工作范围?
答案 0 :(得分:1)
Groovy支持元编程,例如在运行时向现有类添加新方法。考虑以下示例:
class Person {
void greetings(String name) {
println "Greetings, $name!"
}
}
Person.metaClass.hello = { String name -> println "Hello, $name!" }
def john = new Person()
john.greetings("Paul")
john.hello("Mary")
输出:
Greetings, Paul!
Hello, Mary!
在此示例中,我们有一个简单的Person
类和一个方法greetings()
。我们可以通过访问hello()
对象并添加方法Person.metaClass
作为闭包来接受新的方法hello
,该闭包接受类型为name
的单个参数String
。
选中Groovy's documentation on metaprogramming,您将在其中找到许多示例。