@Test
public void likeReflectTest() throws Throwable {
Class<MethodHandles.Lookup> lookupClass = MethodHandles.Lookup.class;
Field implLookup = lookupClass.getDeclaredField("IMPL_LOOKUP");
implLookup.setAccessible(true);
MethodHandles.Lookup lookup = (MethodHandles.Lookup)implLookup.get(null);
MethodHandle getSum = lookup
.in(Phone.class)
.findSpecial(
Phone.class,
"getSum",
methodType(int.class, int.class, int.class),
Phone.class
);
CallSite applyAsInt = LambdaMetafactory.metafactory(
lookup,
"applyAsInt",
methodType(ToIntFunction2.class),
methodType(int.class, Phone.class, int.class, int.class),
getSum,
methodType(int.class, Phone.class, int.class, int.class)
);
ToIntFunction2 string
= (ToIntFunction2) applyAsInt.getTarget().invoke();
int intResult = string.applyAsInt(new Phone(), 1, 0);
System.out.println(intResult);
}
ToIntFunction2.java 是这样的:
@FunctionalInterface
public interface ToIntFunction2 {
int applyAsInt( Phone value1, int value2, int value3);
}
Phone.java 的一个方法是这样的:
int getSum(int param1, int param2) {
return param1 + param2;
}
最后执行出现了 ClassNotDefFound ,哥哥们,是啥原因呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.