Java 将多级对象方法作为参数传递

Java 将多级对象方法作为参数传递,java,Java,如果我的方法调用是: obj.getLevelOne().getLevelTwo().getValue(); 我想将此方法作为以下参数传递: boolean checkValue( obj, method , value) { return obj.method() == value; } 我想像这样调用checkValue方法: checkValue(obj, "getLevelOne().getLevelTwo().getValue", value); 我有什么办法可以做到这一

如果我的方法调用是:

obj.getLevelOne().getLevelTwo().getValue();
我想将此方法作为以下参数传递:

boolean checkValue( obj, method , value) 
{
   return obj.method() == value;
}
我想像这样调用checkValue方法:

checkValue(obj, "getLevelOne().getLevelTwo().getValue", value);

我有什么办法可以做到这一点吗?请提供帮助。

在java中,函数并不是一个一流的概念(但在java 8中)。因此,在许多其他具有函数概念的语言中,传递方法是不可能的

您需要做的是声明一个接口并使用匿名内部类实现它。e、 g

界面

interface MyGetter {
    Object doGet();
}
interface MyGetter<T> {
    T doGet();
}
检查方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}
<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}
通话

checkValue(new MyGetter() {
    public Object doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5);
checkValue(new MyGetter<SomeClass>() {
    public SomeClass doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5); 
我们在调用中实际做的是创建一个新类和该类型的对象,以进行实际需要的调用

编辑:

如果需要不同的返回类型,可以将接口和检查方法设置为泛型,例如

界面

interface MyGetter {
    Object doGet();
}
interface MyGetter<T> {
    T doGet();
}
接口MyGetter{ T doGet(); } 检查方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}
<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}

boolean checkValue(java函数中的MyGetter不是一个一流的概念(现在,在java8中出现)。因此,在许多其他具有函数概念的语言中,传递方法是不可能的

您需要做的是声明一个接口并使用匿名内部类实现它

界面

interface MyGetter {
    Object doGet();
}
interface MyGetter<T> {
    T doGet();
}
检查方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}
<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}
通话

checkValue(new MyGetter() {
    public Object doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5);
checkValue(new MyGetter<SomeClass>() {
    public SomeClass doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5); 
我们在调用中实际做的是创建一个新类和该类型的对象,以进行实际需要的调用

编辑:

如果需要不同的返回类型,可以将接口和检查方法设置为泛型,例如

界面

interface MyGetter {
    Object doGet();
}
interface MyGetter<T> {
    T doGet();
}
接口MyGetter{ T doGet(); }
检查方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}
<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}

boolean checkValue(MyGetter如果您真的想这样做,我建议您:

1.使用可调用并创建匿名子类。注意:这有点类似于上面给出的“MyGetter”方法,只是它使用可调用。不需要我们自己的接口,因为我们可以使用jdk内置的用于此目的的东西

public boolean checkValue(可调用的valueGetter,T值){
返回value.equals(valueGetter.call());
}
最终MyObject obj=新的MyObject();
checkValue(新的可调用(){
公共字符串调用(){return obj.getLevelOne().getLevelTwo().getValue();}
}"富";;
2.使用某种EL包(mvel作为嵌入式库工作得很好)

然后,您可以使用“levelOne.levelTwo.value”作为表达式,并使用mvel在“obj”上进行求值

公共布尔校验值(对象对象对象、字符串表达式、T值){
Object objVal=MVEL.eval(表达式,obj);
返回值.equals(objVal);
}
校验值(obj,“levelOne.levelTwo.value”,“foo”);

当然,第一种方法更具类型安全性,尽管您的“表达式”将在编译时完成,因为您要将其显式编码到可调用实现中。第二种方法更具动态性,允许您在运行时计算表达式。

如果您真的想这样做,我建议您:

1.使用可调用并创建匿名子类。注意:这有点类似于上面给出的“MyGetter”方法,只是它使用可调用。不需要我们自己的接口,因为我们可以使用jdk内置的用于此目的的东西

public boolean checkValue(可调用的valueGetter,T值){
返回value.equals(valueGetter.call());
}
最终MyObject obj=新的MyObject();
checkValue(新的可调用(){
公共字符串调用(){return obj.getLevelOne().getLevelTwo().getValue();}
}"富";;
2.使用某种EL包(mvel作为嵌入式库工作得很好)

然后,您可以使用“levelOne.levelTwo.value”作为表达式,并使用mvel在“obj”上进行求值

公共布尔校验值(对象对象对象、字符串表达式、T值){
Object objVal=MVEL.eval(表达式,obj);
返回值.equals(objVal);
}
校验值(obj,“levelOne.levelTwo.value”,“foo”);

当然,第一个更安全,尽管你的“表达式”将在编译时完成,因为您正在显式地将其编码到可调用实现中。第二种方法更具动态性,可以让您在运行时计算表达式。

您的问题非常模糊!请尝试解释您想要的更好。请现在检查?如果您仍然认为问题不清楚,请告诉我。您的问题是什么非常模糊!请尝试更好地解释您想要什么。请现在检查?如果您仍然认为问题不清楚,请告诉我。这样,我们需要在接口中提供所有可能的getter,对吗?恐怕不完全确定您想要做什么。我们正在做的是引入一个抽象层,所以您需要e接口提供检查方法所需的信息。匿名内部类的目的是调整数据所在的类以匹配接口所需的内容。如果您需要不同的返回类型,则可以使用通用签名,请参见我上面添加的示例。函数不是java中的第一类对象8.编译器中只有语法糖允许您使用单个定义的方法轻松实现接口。您在java 8中创建一个lamba,它将成为您分配给它的接口的实例(或您传递它的声明参数).这样,我们需要在接口中包含所有可能的getter,对吗?恐怕不完全确定您要做什么。我们正在做的是引入一个抽象层,因此您可以对接口进行泰勒运算,以提供check方法所需的信息。匿名内部类的目的是调整th