Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用invokedynamic执行具有多态性的方法?_Java_Invokedynamic - Fatal编程技术网

Java 如何使用invokedynamic执行具有多态性的方法?

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动态语言中,所有变量都声明为
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(…)
是更可取的方法。实际上我说的是字节码生成。如果无法找到利用Java7
invokedynamic
API的方法,我将使用反射API。