我想使用静态方法作为setter helper来捕获异常并打印有关失败操作的调试信息.我不希望只有例外细节.我想显示正在设置的属性,以便详细帮助快速调试问题.我正在使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
例:
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 …Run Code Online (Sandbox Code Playgroud) 我昨晚玩Java8 Lambda,我想知道是否可以在运行时检索Lambda表达式.简而言之,据我所知,Lambda表达式在运行时转换为(静态)方法,然后使用InvokeDynamics调用.
我们举个这样的例子:
people.filter(person -> person.getAge() >= minAge);
Run Code Online (Sandbox Code Playgroud)
filter将a Predicate<T>作为参数的自定义方法在哪里.在这个filter方法中,如何person -> person.getAge() >= minAge在这种情况下以与Lambda表达式()相似(或相同)的形式检索参数?
我尝试使用ASM5_BETA读取参数类的生成字节码,但我无法使用ClassVisitor和MethodVisitor来访问与Lambda表达式相关联的方法.
public <T> List<T> filter(Filter<T> expression) {
try {
Class<? extends Filter> expressionClass = expression.getClass();
byte[] content = getClassContent(expressionClass);
ClassReader classReader = new ClassReader(content);
classReader.accept(new PredicateClassVisitor(), 0);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
private byte[] getClassContent(Class<? extends Filter> expressionClazz) throws
IOException {
InputStream stream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(getClassName(expressionClazz.getName()));
return IOUtils.toByteArray(stream);
}
private String getClassName(String expressionClazz) {
return …Run Code Online (Sandbox Code Playgroud) 我可以覆盖功能接口的toString方法吗?或者改写.是否有优雅的方法来更改实现功能接口的匿名内部类并使用lambdas覆盖toString方法?我在JDK8中创建lamba表达式时可以覆盖toString.
interface Iface {
void do();
}
main() {
Iface iface = () -> /*do something*/
System.out.println(iface); // I would like to see anything useful in output
}
Run Code Online (Sandbox Code Playgroud)
我可以覆盖iface的toString吗?