小编Cyc*_*nit的帖子

Java8从类中检索lambda setter

我正在尝试为私有字段的setter获取lambda方法句柄,但由于某种原因,无法找到setter.

这是我正在使用的功能界面:

@FunctionalInterface
public interface ISetter<T, R> {
    void set(T object, R value);
}
Run Code Online (Sandbox Code Playgroud)

这是用于获取setter的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

按照惯例,所有的setter都是相同的:"setField(...)".这是我的测试类:

public class TestEntity {

    private Long id;


    public TestEntity(Long id) { …
Run Code Online (Sandbox Code Playgroud)

java reflection lambda java-8

8
推荐指数
1
解决办法
792
查看次数

确保通用lambda表达式的类型安全性

这有点是Java8从类中检索lambda setter的后续工作.

我正在尝试为给定字段获取getter方法

public <T, R> IGetter<T, R> getGetter(Class<T> clazz, Field field) {

    Class<R> fieldType = null;
    try {
        fieldType = (Class<R>) field.getType();
    } catch(ClassCastException e) {
        error("Attempted to create a mistyped getter for the field " + field + "!");
    }

    return getGetter(clazz, field.getName(), fieldType);
}
Run Code Online (Sandbox Code Playgroud)

这是基本方法:

public <T, R> IGetter<T, R> getGetter(Class<T> clazz, String fieldName, Class<R> fieldType) {

    MethodHandles.Lookup caller = null;
    MethodHandle target = null;
    MethodType func = null;

    try {
        caller = MethodHandles.lookup();
        MethodType …
Run Code Online (Sandbox Code Playgroud)

java generics reflection lambda java-8

6
推荐指数
1
解决办法
269
查看次数

标签 统计

java ×2

java-8 ×2

lambda ×2

reflection ×2

generics ×1