java - 通过 java 反射检索静态声明的函数接口(interface)中使用的静态参数值

标签 java reflection static static-methods functional-interface

在这里查看我的代码:

import java.util.function.Function;

public class StaticArgumentsTest {

    static Function<String, String> staticConsumer(String testValue) {
        return (st) -> testValue + " and " + st;
    }

    static final Function<String, String> aStaticConsumer =
            staticConsumer("Static String Example Value");

    public static void main(String[] args) {
        System.out.println(StaticArgumentsTest.aStaticConsumer.apply("Dynamic String Example Value"));
    }
}

我们有一些带有许多此类功能接口(interface)实现的遗留代码,我宁愿让这些代码处于更易于管理的状态,如数据库,而不是在纯 java 代码中设置这些设置。所以我的问题是,是否可以使用反射找到上面看到的字符串值“静态字符串示例值”?我可能宁愿这样做,也不愿为这些东西编写自己的 java 代码解析器,但据我所知,我一直在这样做。

最佳答案

当然,这高度依赖于实现,不建议用于生产代码,但对于一次性转换任务,它将与普通反射操作和 HotSpot/OpenJDK 的当前实现一起使用:

public class StaticArgumentsTest {

    static Function<String, String> staticConsumer(String testValue) {
        return (st) -> testValue + " and " + st;
    }

    static final Function<String, String> aStaticConsumer =
            staticConsumer("Static String Example Value");

    public static void main(String[] args) {
        System.out.println(aStaticConsumer.apply("Dynamic String Example Value"));
        getCapturedValues(aStaticConsumer);
    }

    private static void getCapturedValues(Object instance) {
        Field[] f = instance.getClass().getDeclaredFields();
        AccessibleObject.setAccessible(f, true);
        for(Field field: f) {
            System.out.print(field.getName()+" ("+field.getType()+"): ");
            try { System.out.println(field.get(instance)); }
            catch(ReflectiveOperationException ex) { System.out.println(ex); }
        }
    }
}
Static String Example Value and Dynamic String Example Value
arg$1 (class java.lang.String): Static String Example Value

当然,这些合成字段没有有意义的名称,但对于仅捕获一个值的 lambda 表达式来说,这是显而易见的,而对于其他值,您可以使用一些合理的启发式方法,例如根据类型或顺序,找出哪个字段对应哪个变量。

关于java - 通过 java 反射检索静态声明的函数接口(interface)中使用的静态参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347758/

相关文章:

ios - 如何遍历结构的静态常量?

php - 一个类有多少个静态方法太多了?

java - StAX - 如何将 XMLInputFactory.IS_VALIDATING 设置为 true?

java - 在 Netbeans 中使用 derby 数据库导出项目

java - 通过 Int 变量表示空字节数组?

java - 如何正确更新 jtable 模型?

c# - 订阅已加载程序集的事件

c# - 在C# 7.0中使用反射获取不包括本地函数的方法?

if语句中的php静态

c# - 获取定义方法的类?