2012-01-10 9 views
5

उदाहरण MethodHandle वर्ग के वर्णन में दिखाया गया है पर WrongMethodTypeException फेंकता फेंकता निम्नलिखित विवरण के साथ बयान mh.invokeExact("daddy",'d','n') के आह्वान में एक WrongMethodTypeException: (CC)Ljava/lang/String; cannot be called with a different arity as ([Ljava/lang/Object;)Ljava/lang/Object;MethodHandle उदाहरण invokeExact कॉल

MethodHandle ऑब्जेक्ट mh में एक प्रतीकात्मक प्रकार वर्णनकर्ता है जो (CC)Ljava/lang/String से संबंधित है। लेकिन जब हम mh.invokeExact("daddy",'d','n') का आह्वान कर रहे हैं, तो तर्क: d और nObject सरणी के रूप में पारित किए जाते हैं और फिर वे char के तर्कों से मेल नहीं खाते हैं।

मुझे पता है कि मैं invokeExcat या invoke के बजाय invokeWithArguments का उपयोग करके उपरोक्त समस्या को हल कर सकते हैं, लेकिन इस उदाहरण के रूप में जावा 7 एपीआई के MethodHandle के विवरण में प्रस्तुत काम करने के लिए चाहिए था। इसके अलावा, invokeWithArguments में invoke/invokeExact के संबंध में एक प्रदर्शन ओवरहेड है।

उत्तर

2

आप इसे कैसे संकलित कर रहे हैं?

यह संदिग्ध रूप से मुझे ज्ञात ग्रहण बग की तरह लगता है।

मैं सिर्फ javac की जांच कर चुके हैं और इस कोड:

import java.lang.invoke.*; 

public class ScratchMH {  
     private static ScratchMH instance = null; 

     public ScratchMH() { 
       super(); 
     } 

     private void run() throws Throwable { 
       Object x, y; String s; int i; 
       MethodType mt; MethodHandle mh; 
       MethodHandles.Lookup lookup = MethodHandles.lookup(); 

       // mt is (char,char)String 
       mt = MethodType.methodType(String.class, char.class, char.class); 
       mh = lookup.findVirtual(String.class, "replace", mt); 
       s = (String) mh.invokeExact("daddy",'d','n'); 
       // invokeExact(Ljava/lang/String;CC)Ljava/lang/String; 

       System.out.println(s); 
     } 

     public static void main(String[] args) throws Throwable { 
       instance = new ScratchMH(); 
       instance.run(); 
     } 
} 

ठीक काम करने के लिए लगता है:

ariel-2:src boxcat$ javac scratch/clj/ScratchMH.java 
ariel-2:src boxcat$ java scratch/clj/ScratchMH 
nanny 
ariel-2:src boxcat$ 

javap से उत्पादन के संबंधित भाग के रूप में अच्छी तरह से समझदार लगता है:

35: invokevirtual #8     // Method java/lang/invoke/MethodHandles$Lookup.findVirtual:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 
    38: astore  6 
    40: aload   6 
    42: ldc   #9     // String daddy 
    44: bipush  100 
    46: bipush  110 
    48: invokevirtual #10     // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;CC)Ljava/lang/String; 
    51: astore_3  
+0

इस बग [इस उदाहरण का] कोड (http://stackoverflow.com/questions/14146570/calling-a-getter- साथ लिनक्स पर OpenJDK 1.7.0_07 साथ भी देखकर है इन-जावा-हालांकि प्रतिबिंब-क्या-सबसे तेजी से रास्ता करने के लिए बार-बार) –

0

invokeExact को एमएच के विधि प्रकार विवरण, और तर्कों के प्रकार के बीच सटीक मिलान की आवश्यकता है। चूंकि एमएच का विधि प्रकार (cc)string है, इसलिए आप एमएच को निष्पादित करना चाहते हैं, पहले और दूसरे तर्क दोनों को होना चाहिए। इस प्रकार, यह की तरह है कि

``String s = (String)mh.invokeExact('a', 'b')`` 
संबंधित मुद्दे