stackoverflow.com/search?q=LambdaMetafactory

аюсь получить дескриптор лямбда-метода для установщика частного поля, но по какой-то причине установщик не может быть найден.

Это функциональный интерфейс, который я использую:

@FunctionalInterface
public interface ISetter<T, R> {
    void set(T object, R value);
}

И этот метод используется для получения сеттера:

public ISetter getSetter(Class clazz, String fieldName, Class fieldType) throws Throwable {

    MethodHandles.Lookup caller = MethodHandles.lookup();
    MethodType setter = MethodType.methodType(Void.class, fieldType);
    MethodHandle target = caller.findVirtual(clazz, computeSetterName(fieldName), setter);
    MethodType func = target.type();

    CallSite site = LambdaMetafactory.metafactory(
            caller,
            "set",
            MethodType.methodType(ISetter.class),
            func.generic(),
            target,
            func
    );

    MethodHandle factory = site.getTarget();
    ISetter r = (ISetter) factory.invoke();

    return r;
}

Все сеттеры, по соглашению, называются одинаково: "setField (...)". Это мой тестовый класс:

public class TestEntity {

    private Long id;


    public TestEntity(Long id) {
        this.id = id;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

Но когда я выполняю этот метод для «id» и «Long.class», я получаю следующее исключение:

Exception in thread "main" java.lang.NoSuchMethodException: no such method: de.cyclonit.exercise.TestEntity.setId(Long)Void/invokeVirtual
    at java.lang.invoke.MemberName.makeAccessException(MemberName.java:871)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1003)
    at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1381)
    at java.lang.invoke.MethodHandles$Lookup.findVirtual(MethodHandles.java:859)
    at de.cyclonit.exercise.AccessorFactory.getSetter(AccessorFactory.java:41)
    at de.cyclonit.exercise.Main.main(Main.java:21)
Caused by: java.lang.NoSuchFieldError: method resolution failed
    at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
    at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000)
    ... 4 more

Я не понимаю, откуда эта ошибка. Метод "void setId (Long)" существует.

public String computeSetterName(String fieldName) {
    return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}

И звонок:

ISetter setter = accessorFactory.getSetter(TestEntity.class, "id", Long.class);

Ответы на вопрос(1)

Ваш ответ на вопрос