Java反射:如何将方法传递给另一个方法以便可以执行(无接口)

时间:2011-03-02 15:33:04

标签: java reflection

我想有一个方法可以调用传递给它的方法。我的想法是在存在死锁异常的情况下重试,而不是在我想要的每个地方添加try catch,我宁愿使用类似retryExecution(Method method)的实用程序。在retryExecution方法内部是处理重试死锁的所有可重用逻辑。我想在没有使用AOP的情况下这样做,也没有使用接口(因为我告诉retryExcution方法调用的方法是什么,而不是依赖于通过接口的方法名称)。

4 个答案:

答案 0 :(得分:10)

您使用界面。

您使用界面。

您使用界面。

或者您使用抽象类,这是该主题的变体。

如果您拒绝使用语言设计来解决此问题并“使用界面”,则会阅读java.lang.reflect的javadoc并获取Method对象并传递它。 http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Java的设计者考虑并拒绝可调用方法作为第一类对象(例如,C ++或C函数值)。

答案 1 :(得分:0)

为此,您必须提供Method实例,Object,您要在其上调用方法和所需参数。

请参阅method invoke on the documentation

答案 2 :(得分:0)

您当然必须知道要重试的方法的名称。如果您知道方法名称并拥有该对象,那么调用该方法很容易。

public Object retry(Object objectWithTheMethod, String methodName) {
    try {
        Method method = objectWithTheMethod.getClass().getMethod(methodName);
        return method.invoke(objectWithTheMethod);
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    } catch (NoSuchMethodException e) {
    }
}

如果方法需要一些参数,它会变得有点复杂。然后,您必须为getMethod指定参数类。即如果方法需要一个String参数:

Method method = objectWithTheMethod.getClass().getMethod(methodName, String.class);

答案 3 :(得分:0)

Lambda表达式很容易。

  1. 升级至Java SE 8

  2. 使用Lambda编写一些代码:

    int sum = 0;
    list.forEach(#{ e -> sum += e.size(); });

  3. 登录freenode并加入#concatenative,#python,#haskell或others之一,并祝贺他们的前瞻性思维

  4. 出售您的SICP副本以支付胜利晚宴。