我正在开发一个使用Java接口作为 more 而不是Java接口的应用程序,即在运行时,用户应该能够在接口类中列出可用的方法,可能是任何东西:
private Class<? extends BaseInterface> interfaceClass.
在运行时,我想枚举可用的方法,然后根据用户选择的方法,调用一些方法。
我的问题是:Java“接口”架构是否为我提供了任何方法,可以在不使用Reflection API的情况下查看和调用方法?
我希望有类似的东西(也许有):
private Interface<? extends BaseInterface> interfaceAPI;
public void someMethod(){
interfaceAPI.listMethods();
interfaceAPI.getAnnotations();
}
也许有一些方法可以使用Type Generics来实现我想要的效果?
谢谢,
费德鲁斯
答案 0 :(得分:5)
这正是为反射而构建的。
答案 1 :(得分:1)
我的问题是:Java“接口”架构是否为我提供了任何方法,可以在不使用Reflection API的情况下查看和调用方法?
a)不,反思是唯一的方法
b)根本不要这样做。如果您需要动态语言,请使用Groovy。它的语法(可以)几乎与java相同,但它已经内置了大部分功能。 (许多其他语言也可以使用,但Groovy在比较语法时最接近Java)
答案 2 :(得分:1)
反射是列出任意对象方法的唯一方法。好吧,解析字节码也有效,但这很乏味。
答案 3 :(得分:1)
看看Apache Commons BeanUtils。它是一个出色的库,用于以编程方式发现对象的方法和属性轻松(即无需编写低级反射代码)。我在几个项目中使用过它。它还提供了一个更容易的API,用于在发现这些对象成员后访问它们。 PropertyUtils和MethodUtils是开始的好地方。
答案 4 :(得分:0)
不幸的是,看起来反射是唯一的出路。不幸的是,反射不仅速度慢,而且编程和维护也很麻烦。所以我建议你使用apache bean util库。 (具体是methodutils。)
答案 5 :(得分:0)
虽然这里无法进行反射,但如果使用注释来标记可调用方法,则可以使其相对轻松。这种方法的一个例子是为webservices设置的javax.jws注释。这里使用的想法非常有用,您可以为每个方法/参数定义一个显示名称,例如。
答案 6 :(得分:0)
使用Annotations的反思很好用
for (Method m : interfaceClass.getMethods()) {
if (m.isAnnotationPresent(UIf.class)) {
UIf x = m.getAnnotation(UIf.class);
addDefinedCommand( new CommandDef(
interfaceClass,
u,
x.name().isEmpty() ? m.getName() : x.name(),
x.description())
);
}
}