如何使用方法引用符号(Class::method)在Java中将方法作为参数传递?

Joã*_*itt 3 java

我想在一个Utils接受两个参数的类中创建方法,第一个是域类,第二个是来自域类的方法(作为引用传递)。这个Utils' 类有一个方法,该方法将创建该类的一个实例并在域类实例的范围内执行该方法。

例如,域类:

public class DomainClass {
  
  public void dummyMethod() {}
  
}
Run Code Online (Sandbox Code Playgroud)

实用程序类:

public class Utils {

  public static void execute(Class<?> clazz, Runnable referenceMethod) {
     Object objInstance = clazz.getConstructor().newInstance();
     // execute the 'referenceMethod' on the scope of 'objInstance'
  }

}
Run Code Online (Sandbox Code Playgroud)

我想电话是这样的:Utils.execute(DomainClass.class, DomainClass::dummyMethod)。但是,这个场景有一些问题:

  1. 如何为Utils类传递这个参数(现在我遇到了一些编译问题)?
  2. 如何在“objInstance”范围内调用“referenceMethod”?

Jon*_*oni 7

DomainClass::dummyMethod是对实例方法的引用,您需要提供一个对象实例来运行它。这意味着它不能是 a Runnable,但它可以是 aConsumer例如。

此外,这将有助于使execute方法通用:

    public static <T> void execute(Class<T> clazz, Consumer<T> referenceMethod) {
        try {
            T objInstance = clazz.getConstructor().newInstance();
            referenceMethod.accept(objInstance);
        } catch (Exception e) {
            e.printStackTrace();
        }
   }
Run Code Online (Sandbox Code Playgroud)

现在你可以这样调用execute

    Utils.execute(DomainClass.class, DomainClass::dummyMethod);
Run Code Online (Sandbox Code Playgroud)

  • 这是“对特定类型的任意对象的实例方法的引用”,官方教程 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 中有一个简短的描述,还有一个较长的讨论与这个stackoverflow问题/sf/ask/1647334181/ (2认同)