SlideShare a Scribd company logo
1 of 27
www.trinea.cn 
Java Annotation 
Trinea
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
示例 
@Override 
public void onCreate(Bundle savedInstanceState); 
@GET("/user/getFriends/{phone}") 
String getFriends(@Path("phone") String phone); 
@InjectView(R.id.user) 
EditText username; 
@Column(name = "Name") 
public String name; 
Override 
Retrofit 
Butter Knife 
ActiveAndroid
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
是什么——注解 
An annotation is a form of metadata, that can be added to Java source code. 
Classes, methods, variables, parameters and packages may be annotated. 
Annotations have no direct effect on the operation of the code they annotate. 
能够添加到Java源代码的语法元数据。类、方法、变量、参数、包都可以被 
注解,可用来将信息元数据与程序元素进行关联 
作用 
标记,用于告诉编译器一些信息 
编译时动态生成代码 
运行时处理逻辑
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
public class Person { 
private int id; 
private String name; 
public Person(int id, String name) { 
this.id = id; 
this.name = name; 
} 
public boolean equals(Person person) { 
return person.id == id; 
} 
public int hashCode() { 
return id; 
} 
} 
public static void main(String[] args) { 
Set<Person> appSet = new 
HashSet<Person>(); 
for (int i = 0; i < 10; i++) { 
appSet.add(new Person(1, "Jim")); 
} 
System.out.println(appSet.size()); 
} 
运行结果如何?
www.trinea.cn 
public class Person { 
private int id; 
private String name; 
public Person(int id, String name) { 
this.id = id; 
this.name = name; 
} 
@Override 
public boolean equals(Object obj) { 
return (obj instanceof Person) && (((Person)obj).id == id); 
} 
@Override 
public int hashCode() { 
return id; 
} 
}
www.trinea.cn 
分类 
1、标准Annotation 
Override, Deprecated, SuppressWarnings 
2、元Annotation 
@Retention, @Target, @Inherited, @Documented 
3、自定义Annotation
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
自定义Annotation 
public class App { 
@MethodInfo( 
author = “gengxinwu@anjuke.com", 
date = "2014/02/14", 
version = 2) 
public String getAppName() { 
return "anjuke"; 
} 
} 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
@Inherited 
public @interface MethodInfo { 
String author() default "jim@anjuke.com"; 
String date(); 
int version() default 1; 
} 
1、注解名即为自定义注解名 
2、注解配置参数名为注解类的方法名
www.trinea.cn 
自定义Annotation 
1、通过@interface定义 
2、方法 
a. 所有方法没有方法体,没有参数没有修饰 
符,实际只允许public & abstract修饰符,默 
认为public,不允许抛异常 
b. 方法返回值只能是基本类型,String, Class, 
annotation, enumeration或者是他们的一维 
数组 
c. 只有一个默认属性,直接用value()函数。 
一个属性没有表示为Mark Annotation 
3、可以加default表示默认值 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
@Inherited 
public @interface MethodInfo { 
String author() default "jim@anjuke.com"; 
String date(); 
int version() default 1; 
}
www.trinea.cn 
元Annotation 
@Documented 是否会保存到Javadoc文档 
@Target – Anonotation可以用来修饰哪些程序元素。TYPE, METHOD, 
CONSTRUCTOR, FIELD, PARAMETER等,未标注则表示所有 
@Inherited – 是否可以被继承,默认为false 
@Retention – 保留时间,可选值SOURCE, CLASS and RUNTIME,默认为CLASS
www.trinea.cn 
自定义Annotation-Retrofit 
@Documented 
@Target(METHOD) 
@Retention(RUNTIME) 
@RestMethod("GET") 
public @interface GET { 
String value(); 
} 
@GET("/group/{id}/users") 
List<User> groupList(@Path("id") int groupId);
自定义Annotation-Butter Knife 
@Retention(CLASS) @Target(FIELD) 
public @interface InjectView { 
int value(); 
} 
www.trinea.cn 
@InjectView(R.id.user) 
EditText username;
自定义Annotation-ActiveAndroid 
www.trinea.cn 
@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Column { 
public enum ForeignKeyAction { 
SET_NULL, SET_DEFAULT, CASCADE, RESTRICT, NO_ACTION 
} 
public String name() default ""; 
public int length() default -1; 
public boolean notNull() default false; 
public ForeignKeyAction onUpdate() default 
ForeignKeyAction.NO_ACTION; 
} 
@Column(name = "Name") 
public String name;
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
解析Annotation——运行时解析 
利用getAnnotation函数得到Annotation信息 
public static void main(String[] args) { 
try { 
Class cls = Class.forName("cn.trinea.java.test.annotation.App"); 
for (Method method : cls.getMethods()) { 
MethodInfo methodInfo = method.getAnnotation(MethodInfo.class); 
if (methodInfo != null) { 
System.out.println("method name:" + method.getName()); 
System.out.println("method author:" + methodInfo.author()); 
System.out.println("method version:" + methodInfo.version()); 
System.out.println("method date:" + methodInfo.date()); 
} 
} 
} catch (ClassNotFoundException e) { 
e.printStackTrace(); 
} 
}
www.trinea.cn 
解析Annotation——运行时解析 
常用函数 
method.getAnnotation(MethodInfo.class); 
method.getAnnotations(); 
method.isAnnotationPresent(MethodInfo.class); 
其他Field Class类似 
运行时解析必须要Retention为RUNTIME
www.trinea.cn 
解析Annotation——编译时解析 
自定义AbstractProcessor 
@SupportedAnnotationTypes({ "cn.trinea.java.test.annotation.MethodInfo" }) 
public class MethodInfoProcessor extends AbstractProcessor { 
@Override 
public boolean process(Set<? extends TypeElement> elements, RoundEnvironment env) { 
HashMap<String, String> map = new HashMap<String, String>(); 
for (TypeElement te : elements) { 
for (Element element : env.getElementsAnnotatedWith(te)) { 
MethodInfo methodInfo = element.getAnnotation(MethodInfo.class); 
map.put(element.getEnclosingElement().toString(), methodInfo.author()); 
} 
} 
return false; 
} 
}
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
原理介绍-Retrofit
www.trinea.cn 
原理介绍-Butter Knife
www.trinea.cn 
原理介绍-ActiveAndroid
www.trinea.cn 
技巧 
如何判断一个Annotation是编译时还是运行时生效??
www.trinea.cn 
目录 
一、Annotation示例 
二、Annotation是什么及作用 
三、Annotation分类 
四、Annotation自定义 
五、Annotation解析 
六、几个开源库Annotation原理介绍
www.trinea.cn 
Q A 
thank you

More Related Content

What's hot

Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPJustin Lin
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识yiditushe
 
AOP概念及实践
AOP概念及实践AOP概念及实践
AOP概念及实践Tony Deng
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJustin Lin
 
Java面试32题
Java面试32题Java面试32题
Java面试32题yiditushe
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringJustin Lin
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集yiditushe
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典ma tao
 
Erlang培训
Erlang培训Erlang培训
Erlang培训liu qiang
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Justin Lin
 
JavaScript object model
JavaScript object modelJavaScript object model
JavaScript object modelKenerLinfeng
 
Java面试题集
Java面试题集Java面试题集
Java面试题集yiditushe
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Abap oo
Abap ooAbap oo
Abap oovernoo
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)Chris Huang
 
所谓闭包
所谓闭包所谓闭包
所谓闭包ilovey4
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 

What's hot (20)

Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOP
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识
 
AOP概念及实践
AOP概念及实践AOP概念及实践
AOP概念及实践
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
 
Java面试32题
Java面试32题Java面试32题
Java面试32题
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
Sun java
Sun javaSun java
Sun java
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典
 
Les3
Les3Les3
Les3
 
Erlang培训
Erlang培训Erlang培训
Erlang培训
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
 
JavaScript object model
JavaScript object modelJavaScript object model
JavaScript object model
 
Java面试题集
Java面试题集Java面试题集
Java面试题集
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Abap oo
Abap ooAbap oo
Abap oo
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 

Similar to Java annotation

Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Justin Lin
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
Android resource-management
Android resource-managementAndroid resource-management
Android resource-managementLucas Xu
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术hoopchina
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL正中 周
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1Che-Cheng Hsu
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二yiditushe
 
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928Yen_CY
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)jane2006
 
所谓闭包
所谓闭包所谓闭包
所谓闭包youzitang
 
Java注解详解
Java注解详解Java注解详解
Java注解详解zlzl245437
 

Similar to Java annotation (20)

Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援
 
Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
Android resource-management
Android resource-managementAndroid resource-management
Android resource-management
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL
 
Java物件導向
Java物件導向Java物件導向
Java物件導向
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二
 
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
 
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
Js培训
Js培训Js培训
Js培训
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
SCJP ch17
SCJP ch17SCJP ch17
SCJP ch17
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
Java注解详解
Java注解详解Java注解详解
Java注解详解
 

More from Trinea Trinea

郑从威 Uc浏览器研发实践分享
郑从威 Uc浏览器研发实践分享郑从威 Uc浏览器研发实践分享
郑从威 Uc浏览器研发实践分享Trinea Trinea
 
余中强 乐逗手游发行技术平台
余中强 乐逗手游发行技术平台余中强 乐逗手游发行技术平台
余中强 乐逗手游发行技术平台Trinea Trinea
 
叶亚明&刘普功 携程Mobile架构演化
叶亚明&刘普功 携程Mobile架构演化叶亚明&刘普功 携程Mobile架构演化
叶亚明&刘普功 携程Mobile架构演化Trinea Trinea
 
姚彤 从360手机卫士的研发经历看大型移动应用开发
姚彤 从360手机卫士的研发经历看大型移动应用开发姚彤 从360手机卫士的研发经历看大型移动应用开发
姚彤 从360手机卫士的研发经历看大型移动应用开发Trinea Trinea
 
柴锋 跨平台移动应用的自动化验收测试
柴锋 跨平台移动应用的自动化验收测试柴锋 跨平台移动应用的自动化验收测试
柴锋 跨平台移动应用的自动化验收测试Trinea Trinea
 
冉有 支付宝钱包的研发挑战和最佳实践
冉有 支付宝钱包的研发挑战和最佳实践冉有 支付宝钱包的研发挑战和最佳实践
冉有 支付宝钱包的研发挑战和最佳实践Trinea Trinea
 

More from Trinea Trinea (6)

郑从威 Uc浏览器研发实践分享
郑从威 Uc浏览器研发实践分享郑从威 Uc浏览器研发实践分享
郑从威 Uc浏览器研发实践分享
 
余中强 乐逗手游发行技术平台
余中强 乐逗手游发行技术平台余中强 乐逗手游发行技术平台
余中强 乐逗手游发行技术平台
 
叶亚明&刘普功 携程Mobile架构演化
叶亚明&刘普功 携程Mobile架构演化叶亚明&刘普功 携程Mobile架构演化
叶亚明&刘普功 携程Mobile架构演化
 
姚彤 从360手机卫士的研发经历看大型移动应用开发
姚彤 从360手机卫士的研发经历看大型移动应用开发姚彤 从360手机卫士的研发经历看大型移动应用开发
姚彤 从360手机卫士的研发经历看大型移动应用开发
 
柴锋 跨平台移动应用的自动化验收测试
柴锋 跨平台移动应用的自动化验收测试柴锋 跨平台移动应用的自动化验收测试
柴锋 跨平台移动应用的自动化验收测试
 
冉有 支付宝钱包的研发挑战和最佳实践
冉有 支付宝钱包的研发挑战和最佳实践冉有 支付宝钱包的研发挑战和最佳实践
冉有 支付宝钱包的研发挑战和最佳实践
 

Java annotation

  • 2. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 3. www.trinea.cn 示例 @Override public void onCreate(Bundle savedInstanceState); @GET("/user/getFriends/{phone}") String getFriends(@Path("phone") String phone); @InjectView(R.id.user) EditText username; @Column(name = "Name") public String name; Override Retrofit Butter Knife ActiveAndroid
  • 4. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 5. www.trinea.cn 是什么——注解 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate. 能够添加到Java源代码的语法元数据。类、方法、变量、参数、包都可以被 注解,可用来将信息元数据与程序元素进行关联 作用 标记,用于告诉编译器一些信息 编译时动态生成代码 运行时处理逻辑
  • 6. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 7. www.trinea.cn public class Person { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } public boolean equals(Person person) { return person.id == id; } public int hashCode() { return id; } } public static void main(String[] args) { Set<Person> appSet = new HashSet<Person>(); for (int i = 0; i < 10; i++) { appSet.add(new Person(1, "Jim")); } System.out.println(appSet.size()); } 运行结果如何?
  • 8. www.trinea.cn public class Person { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public boolean equals(Object obj) { return (obj instanceof Person) && (((Person)obj).id == id); } @Override public int hashCode() { return id; } }
  • 9. www.trinea.cn 分类 1、标准Annotation Override, Deprecated, SuppressWarnings 2、元Annotation @Retention, @Target, @Inherited, @Documented 3、自定义Annotation
  • 10. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 11. www.trinea.cn 自定义Annotation public class App { @MethodInfo( author = “gengxinwu@anjuke.com", date = "2014/02/14", version = 2) public String getAppName() { return "anjuke"; } } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface MethodInfo { String author() default "jim@anjuke.com"; String date(); int version() default 1; } 1、注解名即为自定义注解名 2、注解配置参数名为注解类的方法名
  • 12. www.trinea.cn 自定义Annotation 1、通过@interface定义 2、方法 a. 所有方法没有方法体,没有参数没有修饰 符,实际只允许public & abstract修饰符,默 认为public,不允许抛异常 b. 方法返回值只能是基本类型,String, Class, annotation, enumeration或者是他们的一维 数组 c. 只有一个默认属性,直接用value()函数。 一个属性没有表示为Mark Annotation 3、可以加default表示默认值 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface MethodInfo { String author() default "jim@anjuke.com"; String date(); int version() default 1; }
  • 13. www.trinea.cn 元Annotation @Documented 是否会保存到Javadoc文档 @Target – Anonotation可以用来修饰哪些程序元素。TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER等,未标注则表示所有 @Inherited – 是否可以被继承,默认为false @Retention – 保留时间,可选值SOURCE, CLASS and RUNTIME,默认为CLASS
  • 14. www.trinea.cn 自定义Annotation-Retrofit @Documented @Target(METHOD) @Retention(RUNTIME) @RestMethod("GET") public @interface GET { String value(); } @GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId);
  • 15. 自定义Annotation-Butter Knife @Retention(CLASS) @Target(FIELD) public @interface InjectView { int value(); } www.trinea.cn @InjectView(R.id.user) EditText username;
  • 16. 自定义Annotation-ActiveAndroid www.trinea.cn @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { public enum ForeignKeyAction { SET_NULL, SET_DEFAULT, CASCADE, RESTRICT, NO_ACTION } public String name() default ""; public int length() default -1; public boolean notNull() default false; public ForeignKeyAction onUpdate() default ForeignKeyAction.NO_ACTION; } @Column(name = "Name") public String name;
  • 17. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 18. www.trinea.cn 解析Annotation——运行时解析 利用getAnnotation函数得到Annotation信息 public static void main(String[] args) { try { Class cls = Class.forName("cn.trinea.java.test.annotation.App"); for (Method method : cls.getMethods()) { MethodInfo methodInfo = method.getAnnotation(MethodInfo.class); if (methodInfo != null) { System.out.println("method name:" + method.getName()); System.out.println("method author:" + methodInfo.author()); System.out.println("method version:" + methodInfo.version()); System.out.println("method date:" + methodInfo.date()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
  • 19. www.trinea.cn 解析Annotation——运行时解析 常用函数 method.getAnnotation(MethodInfo.class); method.getAnnotations(); method.isAnnotationPresent(MethodInfo.class); 其他Field Class类似 运行时解析必须要Retention为RUNTIME
  • 20. www.trinea.cn 解析Annotation——编译时解析 自定义AbstractProcessor @SupportedAnnotationTypes({ "cn.trinea.java.test.annotation.MethodInfo" }) public class MethodInfoProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> elements, RoundEnvironment env) { HashMap<String, String> map = new HashMap<String, String>(); for (TypeElement te : elements) { for (Element element : env.getElementsAnnotatedWith(te)) { MethodInfo methodInfo = element.getAnnotation(MethodInfo.class); map.put(element.getEnclosingElement().toString(), methodInfo.author()); } } return false; } }
  • 21. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 26. www.trinea.cn 目录 一、Annotation示例 二、Annotation是什么及作用 三、Annotation分类 四、Annotation自定义 五、Annotation解析 六、几个开源库Annotation原理介绍
  • 27. www.trinea.cn Q A thank you

Editor's Notes

  1. ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE
  2. ButterKnifeProcessor.java