繁体   English   中英

Java接口反射替代方案

[英]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,用于在发现这些对象成员后访问它们。 PropertyUtilsMethodUtils是开始的好地方。

不幸的是,看起来反射是唯一的出路。 不幸的是,反射不仅速度慢,而且编程和维护也很麻烦。 所以我建议你使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM