2012-12-20 21 views
9

में हस्ताक्षर पॉलिमॉर्फिक तरीकों पर जहां तक ​​मैं कह सकता हूं, जावा 7 में मेथडहैंडल की शुरूआत के साथ संकलक-जेनरेटेड विधि ओवरलोड का परिचय आया।जावा -7

javadoc for MethodHandle राज्यों (मैं उदाहरण छंटनी की है):

Object x, y; String s; int i; 
mh = ... 
// (Ljava/lang/String;CC)Ljava/lang/String; 
// (String, char, char) -> String 
s = (String) mh.invokeExact("daddy",'d','n'); 

// (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 
// (Object, Object, Object) -> Object 
x = mh.invokeExact((Object)1, (Object)2, (Object)3); 

// (Ljava/util/List;)I 
// (List) -> int 
i = (int) mh.invokeExact(java.util.Arrays.asList(1,2,3)); 

// (Ljava/io/PrintStream;Ljava/lang/String;)V 
// (PrintStream, String) -> void 
mh.invokeExact(System.out, "Hello, world."); 

ऊपर कॉल से प्रत्येक नाम के साथ एक एकल invokevirtual अनुदेश उत्पन्न करता है:

यहाँ उपयोग के कुछ उदाहरण हैं आह्वान करें और टाइप डिस्क्रिप्टर टिप्पणियों में इंगित किए गए हैं। तर्क प्रकार सीधे वास्तविक तर्कों से लिया जाता है, जबकि वापसी का प्रकार तत्काल कॉल पर लागू किया जाता है। यह कास्ट एक आदिम हो सकता है। यदि यह गुम है, तो संदर्भ किसी ऑब्जेक्ट पर डिफ़ॉल्ट होता है यदि कॉल संदर्भ में होता है जो रिटर्न मान का उपयोग करता है। यदि कॉल एक कथन के रूप में होता है, तो एक कास्ट असंभव है, और कोई वापसी प्रकार नहीं है; कॉल शून्य है।

असल में, लागू करें और मित्र व्यवहार करते हैं जैसे कि पैरामीटर और रिटर्न प्रकार के हर संभावित संयोजन के लिए अधिभार होता है।

मैंने सुना है कि मेथड हैंडल जावा 8 में लैम्बडास जैसी सुविधाओं के लिए तैयारी कर रहे हैं। (मैं जानता हूँ कि वे पहले से ही पटकथा भाषाओं के लिए उपयोगी होते हैं।)

[/ परिचय]

इसलिए, इन संकलक उत्पन्न भार के जावा में चारों ओर छुपाने का अधिक कर रहे हैं? क्या संकेत हैं कि उनमें से अधिक भविष्य में होंगे (कहें, विस्तार विधियों के साथ)? पहली जगह क्यों जरूरी है? केवल गति? यह लैम्बडास को कैसे मदद करता है ( मैंने सोचा था कि लैम्बडास अज्ञात आंतरिक वर्ग ) को संकलित करेगा?

संक्षेप में, तर्क क्या है; वे अब और भविष्य में उपयोगी क्यों हैं (जेनरेट ओवरलोड)?

अद्यतन: क्या मैं संकलक उत्पन्न भार के यहां फोन, ओरेकल लोग फोन हस्ताक्षर polymophic

उत्तर

10

मैं सिर्फ MethodHandles and invokedynamic

पर एक हॉटस्पॉट internals विकि में आए यह कुछ दिलचस्प बात यह है कि इन सवालों (और कुछ अधिक) का जवाब बनाता है।

  • क्या सवाल में संकलक उत्पन्न भार के कहा जाता है, जावा लोग फोन हस्ताक्षर बहुरूपी।
  • MethodHandle.invokeExact और दोस्तों अद्वितीय हैं, एकमात्र हस्ताक्षर पॉलिमॉर्फिक विधियां हैं।
  • हॉटस्पॉट वी एम पर, MethodHandle.invoke * के लिए invokevirtual बाईटकोड चुपके से एक invokehandle अनुदेश में बदल जाती है।
    • invokehandleinvokedynamic जैसा है; कुछ आंतरिक अलग-अलग होते हैं, और जहां प्रत्येक invokedynamic निर्देश को अपने स्वयं के कॉन्स्टेंट पूल कैश एंट्री (सीपीसीई), invokehandle एस को इंगित करना चाहिए, सीपीसीई साझा कर सकते हैं।
  • invokedynamic गैर सरकारी MethodHandle.invokeBasic हॉटस्पॉट वीएम
    • MethodHandle.invokeBasic पर का उपयोग करता invokeExact लेकिन अधिक ढीली की तरह है; एक के लिए यह कॉलली के प्रकार के साथ कॉल-साइट के प्रकारों की जांच नहीं करता है। (invokedynamic सहित)
  • गर्म विधि हैंडल किया जा सकता है JIT संकलित

साथ ही, लैम्ब्डा भावimplemented via invokedynamic हो जाएगा। (कि एडविन Dalorzo के जवाब से मिल गया।) लैम्ब्डा भाव

इसका मतलब यह है
  • परोक्ष रूप से हॉटस्पॉट वी एम पर MethodHandle.invokeBasic (ऊपर देखें), और
  • का उपयोग करेगा
  • होने के लिए पात्र हैं JIT संकलित
+0

+1 ग्रेट संदर्भ सामग्री। –

4

इन दो लिंक आपके सभी सवालों के जवाब नहीं हो सकता है, लेकिन वे एक अच्छा प्रारंभिक बिंदु हो सकता है:

इस संदर्भ सामग्री वर्तमान में विशेषज्ञ समूह से आ रहा है जेडीके 8 में काम करना: परियोजना लैम्ब्डा। किस्मत के साथ आप लैम्बडा अभिव्यक्तियों की अपनी गलत धारणा के बारे में आंतरिक कक्षाओं के रूप में कुछ स्पष्टीकरण पा सकते हैं।

+0

बहुत जानकारीपूर्ण । धन्यवाद! –

संबंधित मुद्दे