2011-02-04 76 views
2

我正在开发一个应用程序,它使用Java接口作为而不是Java接口,即在运行时,用户应该能够列出接口类中的可用方法,任何事情:Java Interface Reflection Alternatives

private Class<? extends BaseInterface> interfaceClass. 

在运行时,我想枚举可用的方法,然后基于用户选择,调用某种方法。

我的问题是:Java“接口”体系结构是否提供了任何方法让我在不使用Reflection API的情况下查看和调用方法?

我希望有这样的事情(也许有):

private Interface<? extends BaseInterface> interfaceAPI; 

public void someMethod(){ 
interfaceAPI.listMethods(); 
interfaceAPI.getAnnotations(); 
} 

也许有某种方式使用泛型类型来完成我想要什么?

感谢,

费德鲁斯

+0

还有其他的方法,但他们恕我直言,差远了。你没有说过你为什么不想使用反思。也许你的担心可以解决。 – 2011-02-04 15:24:01

+0

您可以即时生成代码(并通过一些自定义类加载器加载它)......但这就是反射实际上所做的。 – bestsss 2011-02-04 18:55:55

回答

5

这正是Reflection的目的所在。

1

我的问题是:是否在Java“接口”架构提供任何方法对我来说,偷看并调用方法,而无需使用反射API?

一)没有,反思是做

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

+0

w/javascript有什么不对?它甚至可以在java本身? – bestsss 2011-02-04 19:40:39

1

反射是列出任意对象方法的唯一方法。那么,解析字节码也是可行的,但它很乏味。

0

不幸的是,它看起来像反射是唯一的出路。不幸的是,反思不仅速度慢,而且编程和维护都很麻烦。所以我建议你使用apache bean util库。 (具体为methodutils。)

1

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

0

虽然这里没有办法反思,但如果使用注释来标记可调用方法,则可以使其相对无痛。此工作方法的一个示例是为webservices设置的javax.jws注释。这里使用的想法可能非常有用,例如,您可以为每个方法/参数定义一个显示名称。

0

反思与注释工作奈斯利

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()) 
      ); 
     } 
}