在Java的动态语言中,所有变量都声明为java.lang.Object
,我需要调用Java内置类。例如,java.math.BigDecimal
构造函数可以接受数字,字符串等。
a = 10 // a is `java.lang.Object`
create java.math.BigDecimal(a) // should call constructor that accept number
a = '1.234' // a is `java.lang.Object`
create java.math.BigDecimal(a) // should call constructor that accept String
我可以使用java.lang.invoke
生成适当的MethodHandle
吗? MethodHandle
应该接受java.lang.Object
作为其参数,但是在调用时,它应该调用正确的构造函数。
答案 0 :(得分:1)
您可以使用java反射,例如使用ConstructorUtils.invokeConstructor(...)
答案 1 :(得分:0)
您正在寻找创建内联缓存。最初,你的bootstrap方法将返回绑定到方法句柄的调用站点,该方法句柄检查其参数类型,在BigInteger上找到正确的构造函数(或任何类型 - 将此类型作为静态参数传递给bootstrap方法),并重新链接调用站点首先检查此类型并调用正确的构造函数,或者再次查找构造函数。因此,如果该调用站点仅传递字符串,则只执行一次构造函数的反射搜索,而进一步调用只是一种类型检查并直接调用构造函数。 (这与JVM内联虚拟方法调用的方式非常相似。)
我不太了解invokedynamic以便为您提供示例代码,但我可以指向JSR 252 Cookbook做类似的事情,其中记录了talk from the JVM Language Summit 2011和{{ 3}}