Dubbo源码解读:appendAnnotation [01]
import java.lang.reflect.Method;
public class AppendAnnotation {
/**
* 获取某个Annotation实例的所有方法值(实际是Annotation的属性值),并把这些方法的值赋值给调用此方法的类的相关的setter方法。
*/
protected void appendAnnotation(Class<?> annotationClass, Object annotation) {
Method[] methods = annotationClass.getMethods(); // 从当前类或接口中(包括父类或父接口)获取公开(public)的方法
for (Method method : methods) {
if (method.getDeclaringClass() != Object.class // 方法所在类不是Object本身
&& method.getReturnType() != void.class // 方法的返回类型不是void
&& method.getParameterTypes().length == 0 // 方法的参数个数为0
&& Modifier.isPublic(method.getModifiers()) // 方法的修饰符为public
&& !Modifier.isStatic(method.getModifiers())) // 方法不是静态的
{
try {
String property = method.getName(); // 方法名称
// 如果方法的名称为“interfaceClass”或者interfaceName”,则统一把方法名称:property的值设置为“interface”
if ("interfaceClass".equals(property) || "interfaceName".equals(property)) {
property = "interface";
}
// 构造set方法的完整名称,比如:set+V+ersion=setVersion、set+G+roup=setGroup等等
String setter = "set" + property.substring(0, 1).toUpperCase() + property.substring(1);
// 通过反射的方式来调用底层方法,annotaion为被调用方法所在的对象(这里是Annotaion对象),value为方法返回值,实际上就是我们设置的annotaion的属性值。
Object value = method.invoke(annotation);
// 如果属性值不为null并且不是方法返回值的默认值
if (value != null && !value.equals(method.getDefaultValue())) {
// 把方法返回值的类型进行装箱
Class<?> parameterType = ReflectUtils.getBoxedClass(method.getReturnType());
// 如果方法名称(属性名称)为filter或listner,annotation中filter和listner定义的是string[]类型
if ("filter".equals(property) || "listener".equals(property)) {
parameterType = String.class;
value = StringUtils.join((String[]) value, ",");
} else if ("parameters".equals(property)) { // String[] parameters() default
// {};这种情况下把string[]转换为Map
parameterType = Map.class;
value = CollectionUtils.toStringMap((String[]) value);
}
try {
// 获取AppendAnnotation方法所在类的setter名称所对应的方法(比如:ReferenceConfig类型的setConnections方法,参数值类型为:Integer)
Method setterMethod = getClass().getMethod(setter, parameterType);
// 通过反射的方式来调用setter方法(相当于new ReferenceConfig().setConnections(1)这样)
setterMethod.invoke(this, value);
} catch (NoSuchMethodException e) {
// ignore
}
}
} catch (Throwable e) {
logger.error(e.getMessage(), e);
}
}
}
}
}
Dubbo源码解读:appendAnnotation [01]的更多相关文章
- Dubbo源码解读
1.提升SOA的微服务架构设计能力 通过读dubbo源码是一条非常不错的通往SOA架构设计之路,毕竟SOA的服务治理就是dubbo首先提出来的,比起你去看市面上的SOA微服务架构的书籍,学到的架构 ...
- prototype.js 源码解读(01)
prototype.js是一个设计的非常优雅且很有实用价值的js基础类库,其源码非常值得研究.研究它的源码不仅能提升个人水平,而且对你打下坚实的js基础也很有帮助.因本人技术水平有限,该解读仅供参考. ...
- 【Dubbo 源码解析】07_Dubbo 重试机制
Dubbo 重试机制 通过前面 Dubbo 服务发现&引用 的分析,我们知道,Dubbo 的重试机制是通过 com.alibaba.dubbo.rpc.cluster.support.Fail ...
- 【Dubbo 源码解析】06_Dubbo 服务调用
Dubbo 服务调用 根据上图,可以看出,服务调用过程为: Consumer 端的 Proxy 调用 Cluster 层选择集群中的某一个 Invoker(负载均衡) Invoker 最终会调用 Pr ...
- 【Dubbo 源码解析】05_Dubbo 服务发现&引用
Dubbo 服务发现&引用 Dubbo 引用的服务消费者最终会构造成一个 Spring 的 Bean,具体是通过 ReferenceBean 来实现的.它是一个 FactoryBean,所有的 ...
- 【Dubbo 源码解析】04_Dubbo 服务注册&暴露
Dubbo 服务注册&暴露 Dubbo 服务暴露过程是通过 com.alibaba.dubbo.config.spring.ServiceBean 来实现的.Spring 容器 refresh ...
- 【Dubbo 源码解析】03_Dubbo Protocol&Filter
Protocol & Filter Dubbo 服务暴露和服务引用都是通过的 com.alibaba.dubbo.rpc.Protocol 来实现的.它是一个 SPI 扩展. @SPI(&qu ...
- 【Dubbo 源码解析】02_Dubbo SPI
Dubbo SPI:(version:2.6.*) Dubbo 微内核 + 插件 模式,得益于 Dubbo SPI .其中 ExtentionLoader是 Dubbo SPI 最核心的类,它负责扩展 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
随机推荐
- Charles抓包https
Charles抓包https 灰灰是只小贱狗 2018.05.08 10:46 字数 762 阅读 7800评论 3喜欢 3 抓取HTTPS请求包,对数据进行排查检验 1.安装Charles 2.电脑 ...
- C# 获取文件的MIME类型
在C#中获取文件的MIME类型(Content Type)的方法如下 一.使用MimeMapping类 在System.Web程序集中,当前为静态类,就一个获取 // // 摘要: // 映射文档扩展 ...
- Visual Studio Code 配置 gcc
作者:谭九鼎链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- MySQL C API的一个让我头疼的问题,获得一行记录中包括NULL
遇到过几次错误,通过gdb来查看错误对战,发现错误居然是atoi调用出错,除非atoi(NULL) 才会报这种错误.说明 row[0]==NULL. (gdb) bt #0 0x00007f82c66 ...
- Class:Task 类
ylbtech-.Net-Class:Task 类 1. Task 类返回顶部 1-1. #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, ...
- QT中文乱码与国际化支持
QT国际化支持 Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性.Qt本身提供的linguist工具,用来实现翻译过程十分方便.MFC中利用资源DLL切换资源,或 ...
- 全文检索(SOLR)前端应用浅析 (转)
最近在一个关于知识管理系统中检索的一个功能方案,找到了一个很好的参考应用方案嘎要的分析一下,希望有类似应用的可以交流交流. 提起全文检索,Lucene的大名估计地球人都知道,通过这么多年的发展,外围的 ...
- Axure-Axure RP For Chrome 演示扩展
Axure RP生成的Html原型,其中包含JS文件,在本地进行演示时浏览器IE会弹出安全提醒.谷歌浏览器Chrome则需要在线安装一个Axure的扩展工具才可以演示. Axure RP Extens ...
- 基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线! https://www.sohu.com/a/168292858_747818 https://github.com/ ...
- Cognos11只需简单几步创建你的Dashboard
一.环境 操作系统:win10 数据库 :SQLserver 2008 R2 软件版本:IBM Cognos Analytics 11.0.6 浏览器 :IE 11 二.开始创建仪表板 2.1 ...