TL
잘 알려진 동적 언어 (예 : JavaScript)로 작성된 코드와 invokedynamic을 사용하는 Java 바이트 코드에서 코드가 어떻게 나타나는지, invokedynamic의 사용법이 앞으로 나아갈 이유를 설명하십시오 . 내가 봤와 인터넷에 모두가 JVM에 속도 동적 언어를 도움이 될 것이라고에 동의 한 것으로 간주되는없는, 즉 새로운-더 이상 invokedynamic 명령에 대해 꽤 많이 읽고 언제 invokedynamic이 (게으른 상수 외에) 유용합니까?
배경입니다. Thanks to stackoverflow Sable/Jasmin으로 바이트 코드 명령어를 직접 실행할 수있었습니다.
나는 invokedynamic가 게으른 상수에 유용하다는 것을 이해했으며, 나는 또한 어떻게 이해했는지 생각한다. the OpenJDK takes advantage of invokedynamic for lambdas.
오라클은 a small example이 있지만, 지금까지의 내가이 경우 invokedynamic의 사용을 말할 수있는 "가산"에 대한 예제로 목적을 격파 할 수 훨씬 더 간단, 신속하고 다음 바이트 코드로 표현 거의 같은 효과 :
aload whereeverAIs
checkcast java/lang/Integer
aload whereeverBIs
checkcast java/lang/Integer
invokestatic IntegerOps/adder(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
어떤 이유로 오라클의 부트 스트랩 방법은 두 인수가 정수 어쨌든 것을 알고 있기 때문에. 그들은 심지어 그것을 "인정"한다 :
[..] [..] 인수는 [Integer] 객체라고 가정한다. 부트 스트랩 방법의 매개 변수 (이 예제에서는 callerClass, dynMethodName 및 dynMethodType)가 다른 경우 부트 스트랩 방법을 사용하려면 invokedynamic [..]을 올바르게 연결하는 추가 코드가 필요합니다.
물론 그렇습니다. 여기에 invokedynamic을 사용하는 데 "추가 코드"가 필요하지 않습니다.
그렇기 때문에 Javadoc과 Blog의 두 항목을 추가하면 invokestatic/invokevirtual/invokevirtual 또는 getfield가 제대로 작동 할 때 invokedynamic을 사용하지 않는 방법을 잘 알고 있다고 생각합니다.
이제 우리는 실제적인 유즈 케이스에 실제로 invokedynamic 명령을 적용하여 "전통적인"호출 (게으른 상수를 제외하고 나는 ...)을 통해 할 수있는 것보다 개선 된 점을 알고 싶습니다.