如何获取类(Java)中所有方法的方法引用?
方法 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 f = Test::op0;
但是,如何获取类中所有方法的方法引用?
没有reflection可行的解决方案,因为现有方法的动态发现是reflection操作。 但是,一旦发现了方法并且创建了方法引用实例(或其动态等价物),代码的实际调用将在没有reflection的情况下运行:
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 OPS; static { HashMap 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)
调用特定的op而不使用OPS.get(name).applyAsDouble(doubleValue)
或者使用调用所有操作,例如
OPS.forEach((name,op)-> System.out.println(name+'('+42+") => "+op.applyAsDouble(42)));
- 什么是正确的Java main()方法参数语法?
- Java,如何使用compareTo对Arraylist进行排序
- 无法在java类中导入org.sun.management.OperatingSystemMXBean?
- Jax-RS MessageBodyReader
- Java和PHP之间的加密/解密字符串
- 在java.time中从`MonthDay`或`YearMonth`类本地化字符串?
- 在Tomcat上运行Play Framework 2.0?
- Eclipse类型层次结构并不总是有效
- 获取NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()