Java 如何使用invokedynamic执行具有多态性的方法?
在Java动态语言中,所有变量都声明为Java 如何使用invokedynamic执行具有多态性的方法?,java,invokedynamic,Java,Invokedynamic,在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 ja
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
作为它的参数,但是当被调用时,它应该调用正确的构造函数。您可以使用java反射,例如使用创建一个内联缓存。最初,引导方法将返回绑定到方法句柄的调用站点,该方法句柄检查其参数类型,在BigInteger上找到正确的构造函数(或任何类型--将此类型作为静态参数传递给引导方法),并将调用站点重新链接到第一个检查此类型并调用正确的构造函数,或者返回到再次查找构造函数。因此,如果调用站点只传递字符串,则只需对构造函数执行一次反射搜索,进一步的调用只是类型检查和对构造函数的直接调用。(这非常类似于JVM对内联虚拟方法调用所做的操作。)
我对invokedynamic不太了解,无法为您提供这方面的示例代码,但我可以指出您正在做类似的事情,这是用and记录的。我是否应该使用
invokestatic
直接调用ConstructorUtils.invokeConstructor()
还是应该继续使用invokedynamic
并指定ConstructorUtils.invokeConstructor()
作为调用站点目标?哪一个更好?对于静态方法,您可以使用MethodUtils
中的方法。。。为了创建BigDecimal
对象BigDecimal.valueOf(…)
是更可取的方法。实际上我说的是字节码生成。如果无法找到利用Java7invokedynamic
API的方法,我将使用反射API。