版权声明:本文为博主原创文章,未经博主允许不得转载。 https://mp.csdn.net/postedit/84845391
在c/c++中,我们有一个指针概念,但是java没有,因此,某些效果的实现方法可能不一样。
以下情景,在c#中叫做事件的委托;
笔者是个初学者,当初学java时碰到一个难题, java为什么不能像c++中,传什么函数到另一个函数(暂且命名为'f1()'函数)中,那么f1()函数就应该怎么执行。如今笔者发现解决了这个难题的方法。
一、c++场景
1. c++中 有
f1(void(*anyFuncton)(int), int a) { .......//可以做一些别的方法共同操作的事 //传什么方法进来,我们就怎么执行这个f1函数 anyFunction(a); .......//也可以做一些别的方法共同操作的事 }
2. 现在比如我有两个 函数,
deleteRow(int id); copyRow(int id);
3. 但我们在某些情景下,使用这两个函数时希望对 id 做点别相同的修改,但是大部分情景都不需要对 id 进行修改,这时我们就能进行下面的操作:
f1(void(*anyFuncton)(int), int id) { id++;//比如我要对id进行修改 //传什么方法进来,我们就怎么执行这个f1函数 anyFunction(id); }
4. 调用时:
//执行deleteRow前对id进行修改; f1(deleteRow,id); //执行copyRow前对id进行修改; f1(copyRow,id);
这样就能实现我们要的功能。
二、Java相同场景的实现
1. 首先我们定义一个类 ‘OptionBean’,它有deleteRow()和copyRow()这两个方法。当然,这两个方法也一定要在同一个类中。
public class OptionBean { public void deleteRow(int id){......} public void copyRow(int id){........} }
2. 我们定义一个工具类‘AlterMyOptionUtil’, 它有一个代理类,也就是类似与上面c++例子的f1()函数,他们有同样的功能。
public class AlterOptionUtil { /** * 不需要给bean设值的方法 * @param anyFunction 传过来的函数 * @param id 要改的值 * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public void f1(Method anyFunction, int id) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { id++;//比如我要对id进行修改 //传什么方法进来,我们就怎么执行这个f1函数 anyFunction.invoke(new OptionBean,id); } /** * 如果想给bean设值的话,我们加多一个Object类型的参数 * @param anyFunction 传过来的函数 * @param id 要改的值 * @prarm obj 已经分配内存的,且anyFunction()方法所在的对象 * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public void f1(Method anyFunction, int id, Object obj) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { id++;//比如我要对id进行修改 //传什么方法进来,我们就怎么执行这个f1函数。这种做法几乎是万能的 anyFunction.invoke(obj,id); } }
3. main线程中调用:
public class MyTest { public static void main(String[] args) throws NoSuchMethodException, SecurityException { //实例化所拥有相应方法的对象,实际业务中,对象可能是传过来的,这里直接实例化模拟 OptionBean optionBean = new OptionBean(); try { //实例化一个id用于测试 int id = 10; //调用方法 optionBean .f1(fm.getClass().getMethod("deleteRow",int.class), id, optionBean); //调用方法 optionBean .f1(fm.getClass().getMethod("copyRow",int.class), id, optionBean); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } }
就这样就大功告成啦!