哥哥们,我看完一个大佬类似反射特性执行了 String 对象的任意方法,自己是照葫芦画瓢试了报错了

15次阅读

共计 975 个字符,预计需要花费 3 分钟才能阅读完成。

@Test
    public void likeReflectTest() throws Throwable {Class 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,哥哥们,是啥原因呢

正文完
 0