簡體   English   中英

如何從作為 lambda 傳遞的功能接口對象的實例獲取參數?

[英]How to get arguments from an instance of functional interface object passed as lambda?

@FunctionalInterface
public interface ServiceCaller {
    void callService();
}

//common method to execute any service call
public void executeService(ServiceCaller serviceCaller) {
    //do common things
    //i want to access dbValidationRequest/apiValidationRequest here for logging purpose
    try {
        serviceCaller.callService();
    } catch (Exception ex) {
        //do common things
        LogUtils.log(logger, ex);
    }
    //do common things
}

//my clients call this
public void validateFromDb(DbValidationRequest dbValidationRequest){
    commonUtils.executeService(()-> dbValidationService.validate(dbValidationRequest));
}

//my clients call this
public void validateFromApi(ApiValidationRequest apiValidationRequest){
    commonUtils.executeService(()-> apiValidationService.validate(apiValidationRequest));
}


這是 Java Spring 應用程序的控制器。 executeService方法中,我傳遞了一個ServiceCaller接口的實例。 我使用這種方法從控制器調用我的所有服務。 如果我使用 intelliJ IDEA 進行評估,那么我可以在 executeService 方法中查看 dbValidationRequest/apiValidationRequest 的值(如 arg$2,見附圖)。 我需要打印這些對象以進行記錄,我也根本不想使用方面。 我怎樣才能做到這一點。 如果 IntelliJ IDEA 可以看到這些值,為什么我不能以編程方式? 在此處輸入圖片說明

arg$1arg$2可以看作是一個類的字段,因此可以通過反射獲取。

    String var1 = "Content Var 1";
    String var2 = "Content Var 2";

    Supplier<String> stringSupplier = () -> var1 + var2;

    Field[] declaredFields = stringSupplier.getClass().getDeclaredFields();

    for (Field f : declaredFields) {
        f.setAccessible(true);
        System.out.println(
            "Field Name: " + f.getName() +
            ", value: " + f.get(stringSupplier)
        );
    }

    // Field Name: arg$1, value: Content Var 1
    // Field Name: arg$2, value: Content Var 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM