Java 自定义方法引用

Java 自定义方法引用,java,interface,method-reference,Java,Interface,Method Reference,在Java中是否可以使用参数进行方法引用? 请允许我澄清: 我想知道有没有可能写这样的代码 public boolean customEquals(ClassType object) { Predicate<MethodReference> compare = (getter) -> { return this::getter.equals(object::getter); }; return compare.test(

在Java中是否可以使用参数进行方法引用? 请允许我澄清: 我想知道有没有可能写这样的代码

public boolean customEquals(ClassType object) {
     Predicate<MethodReference> compare = (getter) -> {
            return this::getter.equals(object::getter);
        };
    return compare.test(MethodReference);
}
public boolean customEquals(类类型对象){
谓词比较=(getter)->{
返回this::getter.equals(object::getter);
};
返回比较测试(MethodReference);
}
其中ClassType为class,其中声明customEquals方法 MethodReference是指向getter的链接


主要思想是我想将方法传递给接口,接口应该针对当前对象和参数对象执行此方法,并参考您的点

主要思想是我想将方法传递给接口,接口应该为当前对象和参数对象执行>此方法

可以通过反射传递方法来执行。请参阅以下代码部分:

package org.test;

import java.lang.reflect.Method;

public interface SimpleInterface {
    
    public Object exec(Method method, Object param0, Object param1);

}//interface closing
接口有一个方法,该方法将一个方法作为参数

package org.test;

import java.lang.reflect.Method;

public class SimpleClass implements SimpleInterface{
    
    public Integer simpleMethod(Integer a, Integer b) {return a+b;}

    @Override
    public Object exec(Method method, Object param0, Object param1) {
        
        Object retVal=null;
        
        try{retVal=method.invoke(this, param0, param1);}catch(Exception e) {e.printStackTrace();}
    
    return retVal;
    
}//exec closing
}//下课

接口实现以及另一个方法,该方法将被传递以供执行

package org.test;

import java.lang.reflect.Method;

public class SimpleTester {

    public static void main(String[] args) throws Exception{
        
        SimpleClass obj=new SimpleClass();
        Method method=obj.getClass().getMethod("simpleMethod", Integer.class, Integer.class);
        
        Object val=obj.exec(method, new Integer(1), new Integer(2));
        
        System.out.println(val);

    }//main closing

}//class closing
获取方法引用并传递给接口执行的类

package org.test;

import java.lang.reflect.Method;

public class SimpleTester {

    public static void main(String[] args) throws Exception{
        
        SimpleClass obj=new SimpleClass();
        Method method=obj.getClass().getMethod("simpleMethod", Integer.class, Integer.class);
        
        Object val=obj.exec(method, new Integer(1), new Integer(2));
        
        System.out.println(val);

    }//main closing

}//class closing
上面使用反射来实现功能


注意:上面的例子是关于您的观点的JDK8

主要思想是我想将方法传递给接口,接口应该为当前对象和参数对象执行>此方法

可以通过反射传递方法来执行。请参阅以下代码部分:

package org.test;

import java.lang.reflect.Method;

public interface SimpleInterface {
    
    public Object exec(Method method, Object param0, Object param1);

}//interface closing
接口有一个方法,该方法将一个方法作为参数

package org.test;

import java.lang.reflect.Method;

public class SimpleClass implements SimpleInterface{
    
    public Integer simpleMethod(Integer a, Integer b) {return a+b;}

    @Override
    public Object exec(Method method, Object param0, Object param1) {
        
        Object retVal=null;
        
        try{retVal=method.invoke(this, param0, param1);}catch(Exception e) {e.printStackTrace();}
    
    return retVal;
    
}//exec closing
}//下课

接口实现以及另一个方法,该方法将被传递以供执行

package org.test;

import java.lang.reflect.Method;

public class SimpleTester {

    public static void main(String[] args) throws Exception{
        
        SimpleClass obj=new SimpleClass();
        Method method=obj.getClass().getMethod("simpleMethod", Integer.class, Integer.class);
        
        Object val=obj.exec(method, new Integer(1), new Integer(2));
        
        System.out.println(val);

    }//main closing

}//class closing
获取方法引用并传递给接口执行的类

package org.test;

import java.lang.reflect.Method;

public class SimpleTester {

    public static void main(String[] args) throws Exception{
        
        SimpleClass obj=new SimpleClass();
        Method method=obj.getClass().getMethod("simpleMethod", Integer.class, Integer.class);
        
        Object val=obj.exec(method, new Integer(1), new Integer(2));
        
        System.out.println(val);

    }//main closing

}//class closing
上面使用反射来实现功能


注意:上面的示例使用JDK8

注意:自Java 9以来,所有包装器类型构造函数都已弃用
新整数(1)
应该是
整数。valueOf(1)
,因为这利用了整数缓存。@mcepender,注意:)@Ironluca Sry,但我没有抓住要点。如我所见,将方法和2个值传递到exec()方法中,然后将使用2个值作为参数调用此方法。但是我需要,这个方法是从2个参数调用的。例如:exec(method,obj1,obj2){Value-Value=obj.method()+obj.method();}您的回答帮助我理解了我是如何做到这一点的,thxYes,您可以在类的任何对象上调用该方法,方法就是从该对象生成的。实际对象也可以作为参数传递,需要对其调用方法
新整数(1)
应该是
整数。valueOf(1)
,因为这利用了整数缓存。@mcepender,注意:)@Ironluca Sry,但我没有抓住要点。如我所见,将方法和2个值传递到exec()方法中,然后将使用2个值作为参数调用此方法。但是我需要,这个方法是从2个参数调用的。例如:exec(method,obj1,obj2){Value-Value=obj.method()+obj.method();}您的回答帮助我理解了我是如何做到这一点的,thxYes,您可以在类的任何对象上调用该方法,方法就是从该对象生成的。实际对象也可以作为参数传递,需要对其调用方法。您的问题由4个部分组成,每个部分描述或执行与其他三个部分完全不同的操作。1) 您不能使用“带参数的方法引用”,但坚持使用方法引用是没有意义的。lambda表达式可以很容易地用参数描述方法调用。2) 您的代码示例尝试出于任何原因比较两个方法引用。为方法引用创建的对象具有未指定的标识,对它们进行比较会产生未指定的结果。3) 您的代码中没有“customEquals”。4) 1-3中的任何内容都不符合你的问题由4个部分组成的“主要思想”,每个部分描述或做的事情与其他三个部分完全不同。1) 您不能使用“带参数的方法引用”,但坚持使用方法引用是没有意义的。lambda表达式可以很容易地用参数描述方法调用。2) 您的代码示例尝试出于任何原因比较两个方法引用。为方法引用创建的对象具有未指定的标识,对它们进行比较会产生未指定的结果。3) 您的代码中没有“customEquals”。4) 1-3中的任何内容都不符合“主要思想”