[英]Java Interface Reflection Alternatives
我开发一个应用程序,它利用了Java接口的作为比Java接口更大 ,即在运行时,用户应该能够列出接口类中可用的方法,它可以是任何东西:
private Class<? extends BaseInterface> interfaceClass.
在运行时,我想枚举可用的方法,然后根据用户选择的方法,调用一些方法。
我的问题是:Java“接口”架构是否为我提供了任何方法,可以在不使用Reflection API的情况下查看和调用方法?
我希望有类似的东西(也许有):
private Interface<? extends BaseInterface> interfaceAPI;
public void someMethod(){
interfaceAPI.listMethods();
interfaceAPI.getAnnotations();
}
也许有一些方法可以使用Type Generics来完成我想要的东西?
谢谢,
费德鲁斯
这正是Reflection所构建的。
我的问题是:Java“接口”架构是否为我提供了任何方法,可以在不使用Reflection API的情况下查看和调用方法?
a)不,反思是唯一的方法
b)根本不要这样做。 如果您需要动态语言,请使用Groovy。 它的语法(可以)几乎与java相同,但它已经内置了大部分功能。 (许多其他语言也可以使用,但Groovy在比较语法时最接近Java)
反射是列出任意对象方法的唯一方法。 好吧,解析字节码也有效,但这很乏味。
看看Apache Commons BeanUtils 。 它是一个出色的库, 可以轻松地以编程方式发现对象的方法和属性(即无需编写低级反射代码)。 我在几个项目中使用过它。 它还提供了一个更容易的API,用于在发现这些对象成员后访问它们。 PropertyUtils和MethodUtils是开始的好地方。
不幸的是,看起来反射是唯一的出路。 不幸的是,反射不仅速度慢,而且编程和维护也很麻烦。 所以我建议你使用apache bean util库。 (特别是methodutils 。)
虽然这里无法进行反射,但如果使用注释来标记可调用方法,则可以使其相对轻松。 这种方法的一个例子是为webservices设置的javax.jws注释。 这里使用的想法非常有用,例如,您可以为每个方法/参数定义显示名称。
使用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())
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.