को int[]::new
जैसे सरणी कन्स्ट्रक्टर के लिए मैं कैसे प्राप्त करूं?मैं MethodHandles.Lookup के साथ एक सरणी कन्स्ट्रक्टर MethodHandle को कैसे देखूं?
यह काम नहीं करता:
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
MethodHandle mh = lookup.findConstructor(int[].class, MethodType.methodType(void.class, int.class));
System.out.println(mh);
System.out.println(mh.invoke());
}
यह इस में जो परिणाम:
Exception in thread "main" java.lang.NoSuchMethodException: no such constructor: [I.<init>(int)void/newInvokeSpecial
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:871)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:990)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1382)
at java.lang.invoke.MethodHandles$Lookup.findConstructor(MethodHandles.java:920)
at xx.main(xx.java:11)
Caused by: java.lang.NoSuchMethodError: java.lang.Object.<init>(I)V
at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:962)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:987)
... 3 more
न ही ऐसा करता है:
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
MethodHandle mh = lookup.findConstructor(int[].class, MethodType.methodType(void.class));
System.out.println(mh);
System.out.println(mh.invoke());
}
यह बजाय Object
के लिए निर्माता को खोजने के लिए लगता है:
MethodHandle()Object
[email protected]
बस 'पूर्णांक [] कि जाँच :: नई 'ऑब्जेक्ट लैम्ब्डा $ एमआर $ नया $ नया $ 4ffde7b3 $ 1 (int len) {by new int [len] जैसे बाइटकोड सिंथेटिक विधि में उत्पन्न करता है; } '। –
प्रश्न के संदर्भ में, आप निश्चित रूप से '.bindTo (int.class) .asType (MethodType.methodType (int []। Class, int.class) को चेन करना चाहते हैं)' वांछित हैंडल को 'int' का प्रतिनिधित्व करने के लिए [] :: नया 'तर्क, यानी आप इसे' int [] array = (int []) mh.invokeExact (42) की तरह उपयोग कर सकते हैं; ' – Holger
सभी के लिए धन्यवाद। यह मेरे लिए काम करता है: 'MethodHandles.insertArguments (lookup.findStatic (Array.class, "newInstance", MethodType.methodType (Object.class, class.class, int.class)), 0, int.class) ' – Archie