Java中如何将类的非静态方法存储到变量中?
在Java中存储类的非静态方法到变量(不绑定对象)
当然可以实现,而且完全不需要在变量中存储对象实例,就像你给出的C++成员函数指针示例那样,能复用同一个方法引用操作不同对象。下面是几种可行的实现方式:
1. Lambda表达式(最简单的方式)
你提到的Lambda写法已经是最简洁的方案,结合函数式接口就能规范方法签名,实现需求:
假设你的类定义如下:
class MyClass { public void function(int i) { System.out.println("Hello, World! 输入参数: " + i); } }
使用现成的BiConsumer接口
BiConsumer正好匹配「接收两个参数、无返回值」的方法签名,可以直接用来存储方法引用:
// 存储方法引用的变量,不绑定任何对象 final BiConsumer<MyClass, Integer> func = (obj, param) -> obj.function(param); // 用不同对象调用同一个方法引用 MyClass obj1 = new MyClass(); func.accept(obj1, 10); MyClass obj2 = new MyClass(); func.accept(obj2, 20);
自定义函数式接口(更贴合业务场景)
如果觉得BiConsumer不够直观,也可以自定义专属接口:
@FunctionalInterface interface MyClassMethod { void apply(MyClass obj, int param); } // 存储方法引用 final MyClassMethod func = (obj, param) -> obj.function(param); // 调用方式更贴合语义 func.apply(new MyClass(), 10); func.apply(new MyClass(), 20);
2. 使用反射API(Method类)
Java的反射机制也能实现类似C++成员函数指针的效果,通过Method对象存储方法元信息,调用时传入对象实例和参数即可:
import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws Exception { // 获取MyClass中指定签名的function方法 final Method func = MyClass.class.getMethod("function", int.class); MyClass obj1 = new MyClass(); // 调用方法:第一个参数为对象实例,后续为方法参数 func.invoke(obj1, 10); MyClass obj2 = new MyClass(); func.invoke(obj2, 20); } } class MyClass { public void function(int i) { System.out.println("Hello, World! 输入参数: " + i); } }
注意:反射性能比Lambda表达式低,且需要处理
NoSuchMethodException、IllegalAccessException等异常,非必要场景优先选择Lambda方案。
内容的提问来源于stack exchange,提问作者GuillemVS
相关产品推荐
相关产品推荐

