将 reflect.Method 放入功能界面
Put reflect.Method to a functional interface
例如,我有一个 class 方法
public class SomeClass {
public void someMethod(Object arg) {
//some code
}
}
我在另一个class:
中通过反射得到了方法
SomeClass instance = new SomeClass();
Method method = someClass.class.getMethod();
有什么方法可以把它放到 Consumer<Object>
中然后与 Consumer.accept()
一起使用,还是我必须使用这样的东西:
Consumer<Object> consumer = object -> method.invoke(instance, new Object())
您可以动态创建 Consumer
:
static class SomeClass {
public void someMethod(Object arg) {
System.out.println("test" + arg);
}
}
static Consumer<Object> findConsumer(SomeClass instance) {
try {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType methodType = MethodType.methodType(void.class, Object.class);
return (Consumer<Object>) LambdaMetafactory.metafactory(
lookup,
"accept",
MethodType.methodType(Consumer.class, SomeClass.class),
methodType,
lookup.findVirtual(SomeClass.class, "someMethod", methodType),
methodType)
.getTarget()
.invokeExact(instance);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException();
}
}
并使用它:
Consumer<Object> consumer = findConsumer(new SomeClass());
consumer.accept("hello world");
例如,我有一个 class 方法
public class SomeClass {
public void someMethod(Object arg) {
//some code
}
}
我在另一个class:
中通过反射得到了方法SomeClass instance = new SomeClass();
Method method = someClass.class.getMethod();
有什么方法可以把它放到 Consumer<Object>
中然后与 Consumer.accept()
一起使用,还是我必须使用这样的东西:
Consumer<Object> consumer = object -> method.invoke(instance, new Object())
您可以动态创建 Consumer
:
static class SomeClass {
public void someMethod(Object arg) {
System.out.println("test" + arg);
}
}
static Consumer<Object> findConsumer(SomeClass instance) {
try {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType methodType = MethodType.methodType(void.class, Object.class);
return (Consumer<Object>) LambdaMetafactory.metafactory(
lookup,
"accept",
MethodType.methodType(Consumer.class, SomeClass.class),
methodType,
lookup.findVirtual(SomeClass.class, "someMethod", methodType),
methodType)
.getTarget()
.invokeExact(instance);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException();
}
}
并使用它:
Consumer<Object> consumer = findConsumer(new SomeClass());
consumer.accept("hello world");