我想使用靜態方法作為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
符合規范的實現。是的,它僅在例外情況下速度較慢。

慕田峪9158850
TA貢獻1794條經驗 獲得超7個贊
MethodHandle非常接近這一點。在字節碼級別,它們可以像常量(like Class或Stringliteral)一樣被使用。使用Java 8可以解碼直接句柄。順便說一下,這在內部由lambda表達式/方法參考實現使用。
添加回答
舉報
0/150
提交
取消