考虑以下代码:
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;带注释的方法,使用反射,然后以某种方式将这些方法添加到供应商列表中。 有没有办法可以做到? 怎么样? 感谢。
答案 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