相关疑难解决方法(0)

使用java 8 lambda表达式打印有关错误的调试信息

我想使用静态方法作为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)

java reflection debugging lambda java-8

9
推荐指数
1
解决办法
2615
查看次数

是否可以在运行时检索lambda表达式

我昨晚玩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)

java lambda bytecode java-8

7
推荐指数
1
解决办法
1908
查看次数

我可以使用lambdas覆盖JDK8中的功能接口的toString方法

我可以覆盖功能接口的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吗?

java lambda java-8

2
推荐指数
2
解决办法
1998
查看次数

标签 统计

java ×3

java-8 ×3

lambda ×3

bytecode ×1

debugging ×1

reflection ×1