我正在尝试为私有字段的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) 这有点是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)