Java接口反射替代方案

时间:2011-02-04 15:17:57

标签: java generics reflection interface

我正在开发一个使用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来实现我想要的效果?

谢谢,

费德鲁斯

7 个答案:

答案 0 :(得分:5)

这正是为反射而构建的。

答案 1 :(得分:1)

  

我的问题是:Java“接口”架构是否为我提供了任何方法,可以在不使用Reflection API的情况下查看和调用方法?

a)不,反思是唯一的方法

b)根本不要这样做。如果您需要动态语言,请使用Groovy。它的语法(可以)几乎与java相同,但它已经内置了大部分功能。 (许多其他语言也可以使用,但Groovy在比较语法时最接近Java)

答案 2 :(得分:1)

反射是列出任意对象方法的唯一方法。好吧,解析字节码也有效,但这很乏味。

答案 3 :(得分:1)

看看Apache Commons BeanUtils。它是一个出色的库,用于以编程方式发现对象的方法和属性轻松(即无需编写低级反射代码)。我在几个项目中使用过它。它还提供了一个更容易的API,用于在发现这些对象成员后访问它们。 PropertyUtilsMethodUtils是开始的好地方。

答案 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()) 
            );
         }
 }
相关问题