java 委托机制_通过反射实现Java下的委托机制代码详解
简述
一直对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下的委托机制代码详解相关推荐
- 基于HTTP浏览器缓存机制全面解析看Table表格的css样式代码详解
文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 漂亮的table表格样式 ...
- java word批注_使用反射处理Java批注
java word批注 在上一篇有关Java注释的文章中,我概述了一个最近的用例,并为您提供了一些自定义注释的示例以及如何使用它们. 在本文中,我将更进一步,并为您提供一些自定义注释的示例,以及如何使 ...
- java 佛祖保佑_佛祖保佑 永无bug 注释模板设置详解(仅供娱乐)
1.注释模板效果图 今天在网上看到一段有趣的注释,佛祖保佑 永无bug, 效果如下图所示: 代码如下所示: /** * _ooOoo_ * o8888888o * 88" . "8 ...
- 鬼吹灯java攻略_密室逃脱鬼吹灯攻略完美过关图文详解
密室逃脱鬼吹灯攻略完美过关图文详解,这个游戏在制作上十分的精美,把环境都刻画的很到位,但是剧情真的是太短了啊,完全不能满足小编的需求啊,可能还会有后续关卡出来吧,如果有小伙伴过不去的,可以参考这篇攻略 ...
- java 实现 仿QQ聊天系统 简易地实现 网络 在线聊天 代码详解(附源代码)
首先,实现的效果如下图: 这是一个非常经典的例题,几乎在每本程序语言入门书中都会涉及到一部分原理的讲解.我在这里简单地介绍一下代码的实现,让刚学习网络编程的读者更好的理解和实现,二来加深自己的记忆. ...
- 文本框换行_多行文本框的认识以及代码详解
本文创建于2020年9月,以下为正文: 多行文本框< textarea>< /textarea>是什么呢? 单行文本框只能输入一行信息,而多行文本框可以输入多行信息.比如说在百 ...
- php 工商银行公众号支付代码_微信支付PHP SDK —— 公众号支付代码详解
在微信支付 开发者文档页面 下载最新的 php SDK 这里假设你已经申请完微信支付 1. 微信后台配置 如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请 ...
- java委托机制教程_通过反射实现Java下的委托机制代码详解
简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...
- java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...
原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...
最新文章
- 【GDKOI2004】使命的召唤
- [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件...
- 纯ajax html网页,JavaScript – 页面加载纯HTML AJAX网站中的替代品
- 中高级JavaScript易错面试题
- 前端学习(2488):使用git获取代码
- JAVA内存模型及垃圾回收自我总结
- js基础--变量、数据类型、循环、判断、函数定义
- 10.Configure One-to-Many(配置一对多关系)【Code-First系列】
- Mysql实战练习之简单图书管理系统
- Mstar 方案白板书写加速
- 法语语法学习笔记——代词(1)
- 有情感会说话,虚拟人脸Zoe诞生
- 3.29 判断电脑无线网卡是否支持5GHz频段
- Linux 目录结构及常用命令详细介绍
- Android user版通过adb_enable开启adb 调试 不提示对话框
- 微信第三方服务平台源码分析——每个Action与模块的对应关系
- 【蓝桥杯】三羊献瑞-算法题JAVA解
- C语言strstr函数
- Farfetch纽交所上市:估值超50亿美元 京东IDG是股东
- 浅谈rpc(远程过程调用)
热门文章
- PHP的pathinfo()
- team网卡配置_Windows下的网卡Teaming 配置教程(图文)
- arduino定时器函数如何使用_Excel表格技巧—如何使用DELTA 函数
- centos7安装docker安装rabbitmq(2021)亲测有效!!!
- ubuntu16.04无法连接WiFi搜索不到网络网卡驱动
- mysql出现Access denied for user ‘root‘@‘%‘ to database ‘xxx‘ 解决办法
- python3.7.2怎么使用win7_Win7同时安装Python2和Python3的配置
- android资源包混淆,Android---andresguard资源混淆
- 【css】文字垂直居中
- 【thymeleaf】Access to request parameters is forbidden in this context