Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在函数接口中通过反射调用方法_Java_Reflection_Interface_Functional Programming - Fatal编程技术网

Java:在函数接口中通过反射调用方法

Java:在函数接口中通过反射调用方法,java,reflection,interface,functional-programming,Java,Reflection,Interface,Functional Programming,有人知道我是否可以通过在函数接口体中的反射来调用方法吗 我想返回一个谓词。因此,典型的语法是 Predicate<Data> pred = data -> data.getVar1().equals("foobar"); 谓词pred=data->data.getVar1().equals(“foobar”); 但是在我的特例中,由于类和方法是变量,所以它们都不知道要调用 所以我想得到这样的东西: Method method = Class.forName("Data").

有人知道我是否可以通过在函数接口体中的反射来调用方法吗

我想返回一个谓词。因此,典型的语法是

Predicate<Data> pred = data -> data.getVar1().equals("foobar");
谓词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");
Method=Class.forName(“数据”).getMethod(“getVar1”),(Class[])null;
谓词pred=数据->
((String)method.invoke(data,(Object[])null)).equals(“foobar”);
但Eclipse说:“未处理异常”。所以我用try-catch来包围它,但是Eclipse已经显示了相同的消息

有人能给我一些线索吗?

试试这个:

    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;
    };
谓词pred=data->{
试一试{
return((String)method.invoke(data,(Object[])null)).equals(“foobar”);
}捕获(IllegalAccessException IllegalAccessException){
//  
}捕获(IllegalArgumentException IllegalArgumentException){
//
}捕获(InvocationTargetException InvocationTargetException){
//
}
返回false;
};

enclosure method.invoke to method=)动态加载的类
Data
和编译时类型
T
之间的关系是什么?如果一个函数期望它的参数是
Data
类型,那么它声称接受
t
类型的参数,这看起来是不对的。
String
的转换已经过时,您可以简单地调用
equals
,因为该方法已经在
对象中定义。此外,捕获将覆盖所有必要的已检查异常的
ReflectiveOperationException
就足够了。另外,请注意
调用的varargs性质;您可以简单地说
method.invoke(data)
。把它们放在一起:
Predicate pred=data->{try{return method.invoke(data.equals(“foobar”);}catch(ReflectiveOperationException ex){throw new AssertionError(ex);}}
问题是关于未处理的异常。我接受了topic starter的片段。