我想使用静态方法作为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却不存在。现在可以做类似将setter方法传递给另一个方法的事情。
3 回答
倚天杖
TA贡献1828条经验 获得超3个赞
那么SerializedLambda
是在保持不同的实现之间的兼容性的形式。从writeReplace
理论上讲,只有该方法可以替换为其他机制。如果您想完全安全,则必须将对象实际写入,例如写入字节数组并解析输出。输出必须包含SerializedLambda
符合规范的实现。是的,它仅在例外情况下速度较慢。
慕田峪9158850
TA贡献1794条经验 获得超7个赞
MethodHandle非常接近这一点。在字节码级别,它们可以像常量(like Class或Stringliteral)一样被使用。使用Java 8可以解码直接句柄。顺便说一下,这在内部由lambda表达式/方法参考实现使用。
添加回答
举报
0/150
提交
取消