简述

一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考。

模块API

public Class Delegater()//空参构造,该类管理委托实例并实现委托方法

//添加一个静态方法委托,返回整型值ID代表该方法与参数构成的实例。若失败,则返回-1。

public synchronized int addFunctionDelegate(Class> srcClass,String methodName,Object... params);

//添加一个实例方法委托,返回整型值ID代表该方法与参数构成的实例。若失败,则返回-1。

public synchronized int addFunctionDelegate(Object srcObj,String methodName,Object... params);

//根据整型ID从委托实例中删除一个方法委托,返回是否成功

public synchronized Boolean removeMethod(int registerID);

//依次执行该委托实例中的所有方法委托(无序)

public synchronized void invokeAllMethod();

//将参数表转换为参数类型表

private Class>[] getParamTypes(Object[] params);

//由指定的Class、方法名、参数类型表获得方法实例

private Method getDstMethod(Class> srcClass,String methodName,Class>[] paramTypes);

class DelegateNode(Method refMethod,Object[] params)//DelegateNode类在不使用Object构造时叙述了一个静态方法委托,包括方法实例及参数表

class DelegateNode(Object srcObj,Method refMethod,Object[] params)//DelegateNode类在使用Object构造时叙述了一个实例方法委托,包括类实例、方法实例及参数表

public void invokeMethod();

//执行该节点叙述的方法委托

源代码

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Hashtable;

/**Delegater类使用RTTI及反射实现Java下的委托机制

* @author 三向板砖

* */

public class Delegater {

static int register = Integer.MIN_VALUE;

//ID分配变量

Hashtable nodeTable;

//管理ID与对应委托的容器

public Delegater()

{

nodeTable = new Hashtable();

}

//添加静态方法委托

public synchronized int addFunctionDelegate(Class> srcClass,String methodName,Object... params)

{

Class>[] paramTypes = getParamTypes(params);

Method refMethod;

if((refMethod = getDstMethod(srcClass,methodName,paramTypes)) != null)

{

register++;

nodeTable.put(register,new DelegateNode(refMethod, params));

return register;

} else

{

return -1;

}

}

//添加动态方法委托

public synchronized int addFunctionDelegate(Object srcObj,String methodName,Object... params)

{

Class>[] paramTypes = getParamTypes(params);

Method refMethod;

if((refMethod = getDstMethod(srcObj.getClass(),methodName,paramTypes)) != null)

{

register++;

nodeTable.put(register,new DelegateNode(srcObj,refMethod, params));

return register;

} else

{

return -1;

}

}

//删除一个方法委托

public synchronized Boolean removeMethod(int registerID)

{

if(nodeTable.containsKey(registerID))

{

nodeTable.remove(registerID);

return true;

}

return false;

}

//无序地执行委托方法

public synchronized void invokeAllMethod()

{

for (DelegateNode node:nodeTable.values())

{

node.invokeMethod();

}

}

//将参数表转化为参数类型表

private Class>[] getParamTypes(Object[] params)

{

Class>[] paramTypes = new Class>[params.length];

for (int i = 0;i < params.length;i++)

{

paramTypes[i] = params[i].getClass();

}

return paramTypes;

}

//根据Class类实例、方法名、参数类型表获得一个Method实例

private Method getDstMethod(Class> srcClass,String methodName,Class>[] paramTypes)

{

Method result = null;

try {

result = srcClass.getMethod(methodName, paramTypes);

if(result.getReturnType() != void.class)

{

System.out.println("Warning,Method:"+methodName+" has a return value!");

}

}

catch (NoSuchMethodException | SecurityException e) {

System.out.println("Can Not Found Method:"+methodName+",ensure it's exist and visible!");

}

return result;

}

}

class DelegateNode

{

Object srcObj;

Method refMethod;

Object[] params;

public DelegateNode(Method refMethod,Object[] params)

{

this.refMethod = refMethod;

this.params = params;

}

public DelegateNode(Object srcObj,Method refMethod,Object[] params)

{

this.srcObj = srcObj;

this.refMethod = refMethod;

this.params = params;

}

public void invokeMethod()

{

try {

refMethod.invoke(srcObj,params);

}

catch (IllegalAccessException | IllegalArgumentException

| InvocationTargetException e) {

System.out.println("Method:"+refMethod.toString()+" invoke fail!");

}

}

}

模块测试

public class DelegaterTest {

public void showInfo()

{

System.out.println("Hello Delegate!");

}

public void showCustomInfo(String info)

{

System.out.println(info);

}

public static void showStaticInfo()

{

System.out.println("Static Delegate!");

}

public static void showCustomStaticInfo(String info)

{

System.out.println(info);

}

public static void main(String[] args) {

Delegater dele = new Delegater();

DelegaterTest tester = new DelegaterTest();

int ID = dele.addFunctionDelegate(tester,"showInfo");

dele.addFunctionDelegate(tester,"showCustomInfo","Custom!");

dele.addFunctionDelegate(DelegaterTest.class,"showStaticInfo");

dele.addFunctionDelegate(DelegaterTest.class,"showCustomStaticInfo","StaticCustom!");

dele.invokeAllMethod();

dele.removeMethod(ID);

System.out.println("------------------");

dele.invokeAllMethod();

}

}

执行结果:

StaticCustom!

StaticDelegate!

Custom!

HelloDelegate!

------------------

StaticCustom!

StaticDelegate!

Custom!

其他事项

一些public方法使用synchronized是为了保证register变量的线程安全,使其不会因为多线程而出错。

对于有返回值的委托,会报出警告,但模块还是接受这样的委托的,不过在执行委托时您将不能得到返回值。

添加的委托最大值是Integer.MAX_VALUE-Integer.MIN_VALUE超出后的容错处理没有考虑(一般也没这么多函数需要委托的吧。

委托执行是无序的,而且,需要性能要求时,委托的函数尽量不要有阻塞过程,否则会影响其他委托函数的执行。

还有什么问题可以发上来一同探讨。

总结

以上就是本文关于通过反射实现Java下的委托机制代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他Java相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

java 委托机制_通过反射实现Java下的委托机制代码详解相关推荐

  1. 基于HTTP浏览器缓存机制全面解析看Table表格的css样式代码详解

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 漂亮的table表格样式 ...

  2. java word批注_使用反射处理Java批注

    java word批注 在上一篇有关Java注释的文章中,我概述了一个最近的用例,并为您提供了一些自定义注释的示例以及如何使用它们. 在本文中,我将更进一步,并为您提供一些自定义注释的示例,以及如何使 ...

  3. java 佛祖保佑_佛祖保佑 永无bug 注释模板设置详解(仅供娱乐)

    1.注释模板效果图 今天在网上看到一段有趣的注释,佛祖保佑 永无bug, 效果如下图所示: 代码如下所示: /** * _ooOoo_ * o8888888o * 88" . "8 ...

  4. 鬼吹灯java攻略_密室逃脱鬼吹灯攻略完美过关图文详解

    密室逃脱鬼吹灯攻略完美过关图文详解,这个游戏在制作上十分的精美,把环境都刻画的很到位,但是剧情真的是太短了啊,完全不能满足小编的需求啊,可能还会有后续关卡出来吧,如果有小伙伴过不去的,可以参考这篇攻略 ...

  5. java 实现 仿QQ聊天系统 简易地实现 网络 在线聊天 代码详解(附源代码)

    首先,实现的效果如下图:  这是一个非常经典的例题,几乎在每本程序语言入门书中都会涉及到一部分原理的讲解.我在这里简单地介绍一下代码的实现,让刚学习网络编程的读者更好的理解和实现,二来加深自己的记忆. ...

  6. 文本框换行_多行文本框的认识以及代码详解

    本文创建于2020年9月,以下为正文: 多行文本框< textarea>< /textarea>是什么呢? 单行文本框只能输入一行信息,而多行文本框可以输入多行信息.比如说在百 ...

  7. php 工商银行公众号支付代码_微信支付PHP SDK —— 公众号支付代码详解

    在微信支付 开发者文档页面 下载最新的 php SDK 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请 ...

  8. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

  9. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

最新文章

  1. 【GDKOI2004】使命的召唤
  2. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件...
  3. 纯ajax html网页,JavaScript – 页面加载纯HTML AJAX网站中的替代品
  4. 中高级JavaScript易错面试题
  5. 前端学习(2488):使用git获取代码
  6. JAVA内存模型及垃圾回收自我总结
  7. js基础--变量、数据类型、循环、判断、函数定义
  8. 10.Configure One-to-Many(配置一对多关系)【Code-First系列】
  9. Mysql实战练习之简单图书管理系统
  10. Mstar 方案白板书写加速
  11. 法语语法学习笔记——代词(1)
  12. 有情感会说话,虚拟人脸Zoe诞生
  13. 3.29 判断电脑无线网卡是否支持5GHz频段
  14. Linux 目录结构及常用命令详细介绍
  15. Android user版通过adb_enable开启adb 调试 不提示对话框
  16. 微信第三方服务平台源码分析——每个Action与模块的对应关系
  17. 【蓝桥杯】三羊献瑞-算法题JAVA解
  18. C语言strstr函数
  19. Farfetch纽交所上市:估值超50亿美元 京东IDG是股东
  20. 浅谈rpc(远程过程调用)

热门文章

  1. PHP的pathinfo()
  2. team网卡配置_Windows下的网卡Teaming 配置教程(图文)
  3. arduino定时器函数如何使用_Excel表格技巧—如何使用DELTA 函数
  4. centos7安装docker安装rabbitmq(2021)亲测有效!!!
  5. ubuntu16.04无法连接WiFi搜索不到网络网卡驱动
  6. mysql出现Access denied for user ‘root‘@‘%‘ to database ‘xxx‘ 解决办法
  7. python3.7.2怎么使用win7_Win7同时安装Python2和Python3的配置
  8. android资源包混淆,Android---andresguard资源混淆
  9. 【css】文字垂直居中
  10. 【thymeleaf】Access to request parameters is forbidden in this context