Как получить MethodHandle
для конструктора массива, такого как int[]::new
?Как мне найти конструктор массива MethodHandle с MethodHandles.Lookup?
Это не работает:
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]
Только что проверил, что 'ИНТ [] :: нового 'генерирует в методе синтеза байт-кода, например' Object lambda $ MR $ new $ new $ 4ffde7b3 $ 1 (int len) {return new int [len]; } '. –
В контексте вопроса вы наверняка хотите связать '.bindTo (int.class) .asType (MethodType.methodType (int []. Class, int.class))', чтобы получить желаемый дескриптор, представляющий 'int [] :: new', т. е. вы можете использовать его как 'int [] array = (int []) mh.invokeExact (42);' then – Holger
Спасибо всем. Это сработало для меня: 'MethodHandles.insertArguments (lookup.findStatic (Array.class," newInstance ", MethodType.methodType (Object.class, Class.class, int.class)), 0, int.class)' – Archie