java - 如何获取类中所有方法的方法引用(Java)?

标签 java java-8 method-reference

Java 8 中特定方法的

方法引用 可以作为Class::Method 获得。但是如何获取一个类的所有方法的方法引用呢?

所有需要的方法都具有不同 方法名称,但具有相同 类型签名。此外,这些方法的名称事先未知

例子:

class Test {
    public static double op0(double a) { ... }
    public static double op1(double a) { ... }
    public static double op2(double a) { ... }
    public static double op3(double a) { ... }
    public static double op4(double a) { ... }
}

对已知方法 op0 的方法引用可以通过以下方式获得:

DoubleFunction<Double> f = Test::op0;

但是,如何获取类中所有方法的方法引用呢?

最佳答案

没有反射就没有解决方案,因为现有方法的动态发现反射操作。但是,一旦发现方法并创建了方法引用实例(或它的动态等价物),代码的实际调用将在没有反射的情况下运行:

class Test {
    public static double op0(double a) { ... }
    public static double op1(double a) { ... }
    public static double op2(double a) { ... }
    public static double op3(double a) { ... }
    public static double op4(double a) { ... }

    static final Map<String, DoubleUnaryOperator> OPS;
    static {
        HashMap<String, DoubleUnaryOperator> map=new HashMap<>();
        MethodType type=MethodType.methodType(double.class, double.class);
        MethodType inT=MethodType.methodType(DoubleUnaryOperator.class);
        MethodHandles.Lookup l=MethodHandles.lookup();
        for(Method m:Test.class.getDeclaredMethods()) try {
          if(!Modifier.isStatic(m.getModifiers())) continue;
          MethodHandle mh=l.unreflect(m);
          if(!mh.type().equals(type)) continue;
          map.put(m.getName(), (DoubleUnaryOperator)LambdaMetafactory.metafactory(
            l, "applyAsDouble", inT, type, mh, type).getTarget().invokeExact());
        } catch(Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
        OPS=Collections.unmodifiableMap(map);
    }
}

类初始化后,您可以使用 OPS.get(name).applyAsDouble(doubleValue) 调用不带反射的特定操作,或者使用例如调用所有操作

OPS.forEach((name,op)-> System.out.println(name+'('+42+") => "+op.applyAsDouble(42)));

关于java - 如何获取类中所有方法的方法引用(Java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347434/

相关文章:

java - 带 JMX 的 Datadog,datadog docker 镜像未安装 java

java - 使用java代码清除jboss缓存

java - 如何在 Android 中获取 LinkedIn 联系人或好友列表?

java - 静态初始化程序线程锁定中的 Lambda 表达式

java - "incompatible types"lambda/方法引用和泛型编译器错误

java - 在数组映射期间将 lambda 替换为 flatMap 中的方法引用

Java 和 Ruby : "everything is an object" in OO?

java - 将返回 boolean 值的嵌套 for 循环转换为 java 8 流?

具有条件的嵌套循环的 Java Lambda 表达式

java - 遵循 Venkat Subramaniam 的书,使用 lambda 表达式来玩策略设计模式?