将Java 8 Lambda与注释相结合

时间:2016-02-10 11:55:43

标签: java lambda java-8

考虑以下代码:

i

我的问题是: 而不是明确填写供应商清单:

public class MyTest {
public void sayHello(Supplier<String> myGetter) {
    System.out.println("Hello " + myGetter.get());
}

public static void main(String[] args) {
    Person person = new Person("Michal", "Lefler");
    MyTest myTest = new MyTest();

    List<Supplier<String>> suppliers = new ArrayList<>();
    suppliers.add(person::getName);
    suppliers.add(person::getLastName);

    suppliers.forEach(myTest::sayHello);
}

static class Person {
    private String name;
    private String lastName;

    public Person(String name, String lastName) {
       this.name = name;
        this.lastName = lastName;
    }

    @NameMethod
    public String getName() {
        return name;
    }

    @NameMethod
    public String getLastName() {
        return lastName;
    }

    public String getBlahBlah() {
        return "BlahBlah";
    }

    public String getPakaPaka() {
        return "PakaPaka";
    }
}

@interface NameMethod {}
}

我想使用&#34; @ NameMethod&#34;自动填写供应商列表。注解。我的意思是我想扫描所有&#34; @ NameMethod&#34;带注释的方法,使用反射,然后以某种方式将这些方法添加到供应商列表中。 有没有办法可以做到? 怎么样? 感谢。

3 个答案:

答案 0 :(得分:2)

您可以按照建议使用反射并检查注释并为每种方法创建供应商。

Person p = ...
for (Method m : Person.class.getMethods()) 
    if (m.getAnnotation(NameMethod.class) != null)
        suppliers.add(() -> {
            try {
                 return m.invoke(p);
            } catch (Exception e) {
                 throw new AssertionError(e);
            }
        });

答案 1 :(得分:1)

供应商只是您可以实施的界面。

public static class NameSupplier implements Supplier<String> {

    private final Method method;
    private final Object object;

    public NameSupplier(Method method, Object object) {
        this.method = method;
        this.object = object;
    }

    @Override
    public String get() {
        try {
            return (String) method.invoke(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

如果使用反射,则可以获取所有使用@NameMethod

注释的方法
public static void main(String[] args) {
    Person person = new Person("Michal", "Lefler");
    MyTest myTest = new MyTest();

    List<Supplier<String>> suppliers = new ArrayList<>();
    Method[] methods = Person.class.getMethods();
    for (Method method : methods) {
        if (!method.isAnnotationPresent(NameMethod.class))
            continue;
        suppliers.add(new NameSupplier(method, person));
    }

    suppliers.forEach(myTest::sayHello);
}

答案 2 :(得分:1)

谢谢! 这两个答案都非常有帮助。 我想建议我的解决方案,基于你的,但避免使用反射进行常规方法调用(我们有性能限制)。相反,我正在使用“MethodHandle”对象。

open -u service:jmx:remoting-jmx://localhost:9999
run -b com.your.package:type=BeanName methodName parameter1
close