【问题标题】:Java Interface Reflection AlternativesJava 接口反射替代方案
【发布时间】:2011-06-21 10:32:17
【问题描述】:

我正在开发一个应用程序,它使用 Java 接口作为更多而不是 Java 接口,即,在运行时,用户应该能够列出接口类中的可用方法,这可以是任何东西:

private Class<? extends BaseInterface> interfaceClass.

在运行时,我想枚举可用的方法,然后根据用户的选择,调用一些方法。

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

我希望有这样的东西(也许有):

private Interface<? extends BaseInterface> interfaceAPI;

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

也许有一些方法可以使用类型泛型来完成我想要的?

谢谢,

黄帝

【问题讨论】:

  • 还有其他方法,但恕我直言,它们要糟糕得多。你还没有说为什么你不想使用反射。也许您的担忧可以得到解决。
  • 您可以动态生成代码(并通过一些自定义类加载器加载它)......但这就是反射的实际作用。

标签: java generics reflection interface


【解决方案1】:

这正是反射的目的。

【讨论】:

    【解决方案2】:

    看看Apache Commons BeanUtils。它是一个出色的库,用于以编程方式轻松发现对象的方法和属性(即无需编写低级反射代码)。我已经在几个项目中使用过它。它还提供了一个更简单的 API,用于在发现这些对象成员后对其进行访问。 PropertyUtils 和 MethodUtils 是不错的起点。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • javascript 出了什么问题?它甚至可以在 java 本身中使用?
      • @bestsss JS 没什么问题,它是一门很棒的语言,我从来没有说过别的。但是,当您提出建议时,您必须从某个地方开始
      • 我从来没有暗示你说过任何关于 Javascript 的事情,只是想知道它怎么不是第一选择。
      【解决方案4】:

      反射是列出任意对象的方法的唯一方法。好吧,解析字节码也可以,但是很繁琐。

      【讨论】:

      • 这是一个错误的陈述。您几乎可以动态生成代码,代理和反射在幕后完成。手工也可以。
      • @bestsss 当你得到一个Object 实例时,你如何“手动”列出它的方法?
      • @Bozho,你得到它的类(Object.getClass()) 找到类资源(ClassLoader.getResource(className.replace('.','\')+".class"),加载资源,解析常量池就完成了……嗯,有库可以这样做(例如 bcel),但这就是过程。
      • ...实际上 bcel 和 asm 都是 Sun JDK 的一部分(虽然不是真正正式的;但即使 Sun 也使用它们),所以也不需要额外的库
      • 嗯,是的,你可以解析字节码。但是 getResource(..) 类可能不起作用 - 类不一定需要 .class 文件。
      【解决方案5】:

      不幸的是,反射似乎是唯一的出路。不幸的是,反射不仅速度较慢,而且编程和维护也很麻烦。所以我建议你使用 apache bean util library。 (特别是methodutils。)

      【讨论】:

        【解决方案6】:

        虽然这里无法绕过反射,但如果您使用注释来标记可调用方法,则可以相对轻松地进行。这种方法的一个例子是为 web 服务设置的 javax.jws 注释集。那里使用的想法可能非常有用,例如,您可以为每个方法/参数定义一个显示名称。

        【讨论】:

          【解决方案7】:

          带注释的反射效果很好

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-08
            • 1970-01-01
            • 2012-04-27
            • 2021-10-26
            • 1970-01-01
            • 1970-01-01
            • 2011-04-03
            相关资源
            最近更新 更多