【问题标题】:Java: Calling a method by reflection in a functional interfaceJava:在功能接口中通过反射调用方法
【发布时间】:2016-09-21 20:51:58
【问题描述】:

有谁知道,我是否可以通过函数接口主体中的反射来调用方法?

我想返回一个谓词。所以典型的语法是例如

Predicate<Data> pred = data -> data.getVar1().equals("foobar");

但在我的特殊情况下,类和要调用的方法都不知道,因为它是变量。

所以我想得到这样的东西:

Method method = Class.forName("Data").getMethod("getVar1", (Class[]) null);
Predicate<T> pred = data -> 
                  ((String) method.invoke(data, (Object[]) null)).equals("foobar");

但是 Eclipse 说:“未处理 TargetInvocationException”。所以我用 try-catch 包围了它,但是 Eclipse 已经显示了相同的消息。

有人知道吗?

【问题讨论】:

  • 封装method.invoke到method =)
  • 动态加载的类Data和编译时类型T有什么关系?期望其参数为 Data 类型的函数声称接受 T 类型的参数看起来不正确……

标签: java reflection interface functional-programming


【解决方案1】:

试试这个:

    Predicate<T> pred = data -> {
        try {
            return ((String) method.invoke(data, (Object[]) null)).equals("foobar");
        } catch (IllegalAccessException illegalAccessException) {
//  
        } catch (IllegalArgumentException illegalArgumentException) {
//
        } catch (InvocationTargetException invocationTargetException) {
//
        }
        return false;
    };

【讨论】:

  • 转换为String 已过时,您可以简单地调用equals,因为该方法已在Object 中定义。此外,捕获ReflectiveOperationException 就足够了,这将涵盖所有必要的检查异常。另外,请注意invoke 的可变参数性质;你可以简单地说method.invoke(data)。把它们放在一起:Predicate&lt;T&gt; pred = data -&gt; { try { return method.invoke(data).equals("foobar"); } catch(ReflectiveOperationException ex) { throw new AssertionError(ex); } }
  • 问题是关于未处理的异常。我拿了主题启动器的sn-p。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2013-09-18
相关资源
最近更新 更多