如果我理解正确Groovy是动态类型的,但由于它几乎是Java的超集,因此可以选择提供静态类型信息.如果只编写几个部分对性能至关重要的东西,同时避免使用多种语言的摩擦,这可能很有用.可以仅为性能关键部分提供类型注释.
在使用类似Java的子集和提供静态类型注释的函数/类中使用Groovy而不是Java的性能损失是什么?
这段代码...
class A implements Serializable{
String str
int n
}
try{
def a= new A(str:'abc', n:7)
def out= new ObjectOutputStream(new FileOutputStream('serializedObject.obj'))
out.writeObject(a)
out.close()
}finally{}
try{
def inp= new ObjectInputStream(new FileInputStream('serializedObject.obj'))
def a2= inp.readObject()
inp.close()
}finally{}
Run Code Online (Sandbox Code Playgroud)
...产生错误...
java.lang.ClassNotFoundException: A
at java_io_ObjectInput$readObject.call(Unknown Source)
at otherRun.run(otherRun.groovy:16)
Run Code Online (Sandbox Code Playgroud)
...当尝试在第二个 try 块中重新加载对象时。当该类是一个预定义的类(例如 java.util.List)时,它可以正常工作。将line-for-line 转换为 Java 时,上面的代码也可以正常工作。
我怎样才能让它在 Groovy 中工作?
为了处理我们稍后可以调用的Java实例方法,我们可以调用memfn函数:
user=> (def g (memfn Integer/toString))
#'user/g
user=> (g 789)
"789"
Run Code Online (Sandbox Code Playgroud)
这对Java静态方法不起作用:
user=> (def g (memfn Integer/toHexString))
#'user/g
user=> (g 789)
IllegalArgumentException No matching method found: toHexString for class java.lang.Long clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:52)
user=> (g)
ArityException Wrong number of args (0) passed to: user$g clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)
我们如何获得Java静态方法的句柄,以便稍后调用它?