【发布时间】:2014-02-18 17:19:18
【问题描述】:
我想使用一个静态方法作为 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
编辑:我知道反射对 lambda 没有帮助。我知道 AOP 并且我知道这也可以通过纯反射来实现,但我想知道是否有更好的方法来使用 Java 8 完成此操作,而 Java 7 中不存在。在我看来应该如此。现在可以做一些事情,比如将一个 setter 方法传递给另一个。
【问题讨论】:
-
我不喜欢这个问题的标题。欢迎提出建议或修改。
-
我不确定这是否有帮助,但也许它会对调试信息有所帮助:code.google.com/p/java-interceptor/wiki/Documentation
-
谢谢@Zavior,但我想要一些不那么侵入性的东西,不拦截每个呼叫,而是捕获错误并仅在出现错误时工作。
-
这是一个奇怪的问题。当不是属性而是
Supplier失败时,它如何帮助解决打印属性名称的问题?如果是失败的属性,它的 setter 方法将包含在堆栈跟踪中。如果不是,那么请专注于失败的事情而不是未涉及的财产。 -
@Holger 它为您提供了一个非常有用的上下文,当失败的不是代码而是输入数据时。如果数据错误,则处理可能会失败,并且错误的数据不足以调试,您需要知道该数据应该是什么,例如是人名还是人的电话号码。供应商可能是一个简单的 lambda,例如
s -> s.substring(1)。
标签: java debugging reflection lambda java-8