相关疑难解决方法(0)

LambdaMetafactory的Java访问bean方法

我的问题与 该线程中显式使用LambdaMetafactory密切相关,提供了一些非常好的例子来使用LambdaMetafactory访问类的静态方法; 但是,我想知道访问现有bean实例的非静态字段的等效代码是什么.似乎很难找到一个例子,我所执行的每一次尝试都以非工作代码结束.

这是bean代码:

class SimpleBean {
    private Object obj= "myCustomObject";
    private static Object STATIC_OBJECT = "myCustomStaticObject";
    public Object getObj() {
        return obj;
    }
    public void setObj(final Object obj) {
        this.obj = obj;
    }
    public static Object getStaticObj() {
        return STATIC_OBJECT;
    }
    public static void setStaticObj(final Object obj) {
        STATIC_OBJECT = obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是一个成功访问静态方法"getStaticObj()"的工作单元测试:

    @Test
public void accessStaticMethod() throws Throwable
{
    MethodHandles.Lookup caller = MethodHandles.lookup();
    Method reflected = SimpleBean.class.getDeclaredMethod("getStaticObj");
    MethodHandle methodHandle = caller.unreflect(reflected);
    CallSite site = LambdaMetafactory.metafactory(caller, …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

13
推荐指数
1
解决办法
4277
查看次数

我们可以使用java.util.function获得方法名称吗?

我试着做:

public class HelloWorld {
     public static void main(String... args){
        final String string = "a";
        final Supplier<?> supplier = string::isEmpty;
        System.out.println(supplier);
     }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

HelloWorld$$Lambda$1/471910020@548c4f57
Run Code Online (Sandbox Code Playgroud)

我想拿线isEmpty。我怎样才能做到这一点?

编辑:我创建的方法的代码是此之一:

public class EnumHelper {
    private final static String values = "values";
    private final static String errorTpl = "Can't find element with value `{0}` for enum {1} using getter {2}()";

    public static <T extends Enum<T>, U> T getFromValue(T enumT, U value, String getter) {
        @SuppressWarnings("unchecked")
        final T[] elements = (T[]) ReflectionHelper.callMethod(enumT, values); …
Run Code Online (Sandbox Code Playgroud)

java methods functional-programming java-8 method-reference

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

按名称实例化Java lambda函数

我想在Java 8中创建一个lambda函数,获取它的类名,然后再从它的类名实例化该函数.

这是我尝试的:

import java.util.function.Consumer;

public class SimpleLambda
{
    public static void call(String aLambdaClassName, String aArg) throws Exception
    {
        Class<Consumer<String>> lClass = (Class<Consumer<String>>) Class.forName(aLambdaClassName);
        Consumer<String> newlamba = lClass.newInstance();
        newlamba.accept(aArg);
    }

    public static void main(String[] args) throws Exception
    {
        {
            // Attempt with a static method as lambda
            Consumer<String> lambda = Host::action;
            String classname = lambda.getClass().getName();
            call(classname, "Hello world");
        }

        {
            // Attempt with a locally defined lambda
            Consumer<String> lambda = (s) -> { System.out.println(s); };
            String classname = lambda.getClass().getName();
            call(classname, …
Run Code Online (Sandbox Code Playgroud)

java lambda classloader java-8

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

以编程方式创建Java8函数引用

只是一个理论问题,我目前没有实际的用例.

假设我的API接受函数引用作为参数,我想通过'::'语法直接从代码中提取它,或者通过反射收集匹配函数,存储在某些Map中并有条件地调用.

有可能以编程方式转换methodConsumer<String>

Map<String, Consumer<String>> consumers = new HashMap<>();
consumers.put("println", System.out::println);

Method method = PrintStream.class.getMethod("println", String.class);
consumers.put("println", makeFunctionReference(method));
...
myapi.feedInto(consumers.get(someInput.getConsumerId()));
Run Code Online (Sandbox Code Playgroud)

更新:

虽然目前提供的答案不满足于解决方案,但在得到关于LambdaMetaFactory我试图编译此代码的提示之后

public class TestImpl {
    public static void FnForString(String arg) {}
}

public class Test {
    void test() {
        List<String> strings = new ArrayList<>();
        Consumer<String> stringConsumer = TestImpl::FnForString;

        strings.stream().forEach(stringConsumer);
        strings.stream().forEach(TestImpl::FnForString);
        stringConsumer.accept("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

在将只有Test类送入CFR反编译器后,我得到了以下内容:

public class Test {
    void test() {
        ArrayList strings = new ArrayList();
        Consumer<String> stringConsumer = 
            (Consumer<String>)LambdaMetafactory.metafactory( …
Run Code Online (Sandbox Code Playgroud)

java java-8 method-reference

5
推荐指数
1
解决办法
892
查看次数