c++中,方法中放函数指针参数,java用反射去实现同等功能,(事件的委托)

1 篇文章 0 订阅
1 篇文章 0 订阅

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
		}
    }
}

就这样就大功告成啦!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值