如何獲得像int[]::new
這樣的數組構造函數MethodHandle
?如何使用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]
只是檢查了'INT [] ::新'生成字節碼合成方法,比如'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);'然後 – Holger
感謝所有。這對我有效:'MethodHandles.insertArguments(lookup.findStatic(Array.class,「newInstance」,MethodType.methodType(Object.class,Class.class,int.class)),0,int.class)' – Archie