亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用Java 8 Lambda表達式打印有關錯誤的調試信息

使用Java 8 Lambda表達式打印有關錯誤的調試信息

大話西游666 2019-11-19 11:07:21
我想使用靜態方法作為setter助手來捕獲異常并打印有關失敗操作的調試信息。我不只希望異常詳細信息。我想顯示正在設置的屬性,以便詳細幫助快速調試問題。我正在使用Java 8。我應該如何提供或檢測正在設置的屬性?我希望在示例中刪除“名稱”字符串并獲得相同的結果。我知道我不能在提供的setter方法上使用反射,后者將其轉換為lambda表達式,然后轉換為BiConsumer。我知道了,但是需要提供屬性名稱。/** setter helper method **/private static <E, V> void set(E o, BiConsumer<E, V> setter,        Supplier<V> valueSupplier, String propertyName) {    try {        setter.accept(o, valueSupplier.get());    } catch (RuntimeException e) {        throw new RuntimeException("Failed to set the value of " + propertyName, e);    }}例:    Person p = new Person();    Supplier<String> nameSupplier1 = () ->  "MyName";    Supplier<String> nameSupplier2 = () -> { throw new RuntimeException(); };    set(p, Person::setName, nameSupplier1, "name");    System.out.println(p.getName()); // prints MyName    set(p, Person::setName, nameSupplier2, "name"); // throws exception with message  Failed to set the value of name    System.out.println(p.getName()); // Does not execute編輯:我知道反射對lambdas無濟于事。我知道AOP,我也知道也可以通過純反射來完成,但是我想知道是否有更好的方法可以用Java 8做到這一點,而Java 7卻不存在?,F在可以做類似將setter方法傳遞給另一個方法的事情。
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

那么SerializedLambda保持不同的實現之間的兼容性的形式。從writeReplace理論上講,只有該方法可以替換為其他機制。如果您想完全安全,則必須將對象實際寫入,例如寫入字節數組并解析輸出。輸出必須包含SerializedLambda符合規范的實現。是的,它僅在例外情況下速度較慢。 

查看完整回答
反對 回復 2019-11-19
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

MethodHandle非常接近這一點。在字節碼級別,它們可以像常量(like Class或Stringliteral)一樣被使用。使用Java 8可以解碼直接句柄。順便說一下,這在內部由lambda表達式/方法參考實現使用。

查看完整回答
反對 回復 2019-11-19
  • 3 回答
  • 0 關注
  • 1388 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號