Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Android Annotation And AspectJ
Search
Tony
June 28, 2017
Technology
0
130
Android Annotation And AspectJ
Android Annotation And AspectJ
Tony
June 28, 2017
Tweet
Share
Other Decks in Technology
See All in Technology
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
210
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
280
Terraformあれやこれ/terraform-this-and-that
emiki
8
1.4k
Reducing Cross-Zone Egress at Spotify with Custom gRPC Load Balancing Recap
koh_naga
0
200
本当のAWS基礎
toru_kubota
0
510
MLOpsの「壁」を乗り越える、LINEヤフーの Data Quality as Code
lycorptech_jp
PRO
5
500
データベース02: データベースの概念
trycycle
0
160
競技としてのKaggle、役に立つKaggle
yu4u
3
560
MySQL の SQL クエリチューニングの要所を掴む勉強会
andpad
2
6.2k
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
630
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
560
Python と Snowflake はズッ友だょ!~ Snowflake の Python 関連機能をふりかえる ~
__allllllllez__
1
120
Featured
See All Featured
Building Adaptive Systems
keathley
31
1.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
2
1.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Done Done
chrislema
178
15k
Rails Girls Zürich Keynote
gr2m
91
13k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
659
120k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
121
39k
KATA
mclloyd
15
12k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
GitHub's CSS Performance
jonrohan
1025
450k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
Mobile First: as difficult as doing things right
swwweet
216
8.6k
Transcript
Android Annotation and AspectJ by zhengxiaobin
c"OOPUBUJPO ᇿࢳ ൞+%,ࣼႄೆ֥၂۱ۿିb cᇿࢳ൞+BWB֥၂۱ྍ֥ো აࢤ१ޓཌྷර đაোaࢤ१aई൞ᄝ၂۱ ҪՑđૌӫቔູ+BWB֥၂۱ো 5:1& bॖၛലૼᄝЇaোaሳ؍aٚ مaअ҆эਈaٚمҕඔ֥֩భ૫đႨটؓᆃུჭࣉྛඪૼaᇿb֥ቔ
Ⴈ٤ӈ؟đ২ೂğࣉྛщၲҰaളӮඪૼ໓֖aսٳ༅֩
๋ଉᥠጱپӻੜվ֎ғ Override Deprecated SuppressWarnings
p @Deprecated:该注解的作⽤是标记某个过时的类或⽅法 ⽤法:@Deprecated public void fun { …... } p
@Override:该注解⽤在⽅法前⾯,⽤来标识该⽅法是重写⽗类的某个⽅法 ⽤法:@Override public void fun() { …... }
p @SuppressWarnings:可以注释⼀段代码,该注解的作⽤是阻⽌编译器 发出某些警告信息。它可以有以下参数: ➢deprecation:过时的类或⽅法警告 ➢unchecked:执⾏了未检查的转换时警告 ➢fallthrough:当 switch 程序块直接通往下⼀种情况⽽没有 break 时的
警告 ➢path:在类路径、源⽂件路径等中有不存在的路径时的警告 ➢serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告 ➢finally:任何 finally ⼦句不能完成时的警告 ➢all:关于以上所有情况的警告 ⽤法: @SuppressWarnings(value={"unchecked"}) ……代码
ਞܓဳᥴํ8ᐿᔄࣳ҅ړڦฎNullnessဳᥴ̵ᩒრᔄࣳဳᥴ̵ᕚᑕဳᥴ̵ݒᰁᴴګဳᥴ̵ᴴဳᥴ̵ᕮຎ༄ັဳᥴ̵ CallSuperဳᥴ̵ຍԈဳᥴ(IntDefStringDef)̶
ଉአጱپӻғ @NoNull @Nullable @BoolRes, @IdRes, @IntegerRes, @StringRes, @ColorRes @RequiresPermission(Manifest.permission.SET_WALLPAPER) @IntDef
and @StringDef
p 元注解的种类 ➢@Target ➢@Retention ➢@Documented ➢@Inheried p 元注解:专门负责注解其它的注解
@Target:它是被定义在⼀个注解类的前⾯,⽤来说明该注解可以被声明在哪些元素 前。它有以下参数: ➢ElementType.TYPE:说明该注解只能被声明在⼀个类、接⼜(包括注解类型) 、 enum 前 ➢ElementType.FIELD:说明该注解只能被声明在⼀个类的字段(域)前 ➢ElementType.METHOD:说明该注解只能被声明在⼀个类的⽅法前 ➢ElementType.PARAMETER:说明该注解只能被声明在⼀个⽅法参数前 ➢ElementType.CONSTRUCTOR:说明该注解只能声明在⼀个类的构造⽅法前
➢ElementType.LOCAL_VARIABLE:说明该注解只能声明在⼀个局部变量前 ➢ElementType.ANNOTATION_TYPE:说明该注解只能声明在⼀个注解类型前 ➢ElementType.PACKAGE:说明该注解只能声明在⼀个包名前 ⽤法: @Target(ElementType.METHOD) @Target(value=ElementType.METHOD) @Target(ElementType.METHOD,ElementType.CONSTRUCTOR)
p @Retention:它是被定义在⼀个注解类的前⾯,⽤来说明该注 解的⽣命周期。它有以下参数: ➢RetentionPolicy.SOURCE:指定注解只保留在⼀个源⽂件当 中 ➢RetentionPolicy.CLASS:指定注解只保留在⼀个 class ⽂件 中 ➢RetentionPolicy.RUNTIME:指定注解可以保留在程序运⾏
期间
p 注解有三个⽣命周期,它默认的⽣命周期是保留在⼀个 class ⽂件中,但它也可 以由⼀个 @Retention 的元注解指定它的⽣命周期。 ➢Java源⽂件: 当在⼀个注解类前定义了⼀个 @Retention(RetentionPolicy.SOURCE)
的 注解,那么说明该注解只保留在⼀个源⽂件当中,当编译器将源⽂件编译成 class ⽂件时,它不会将源⽂件中定义的注解保留在 class ⽂件中 ➢class ⽂件中: 当在⼀个注解类前定义了⼀个 @Retention(RetentionPolicy.CLASS)的注 解,那么说明该注解只保留在⼀个 class ⽂件当中,当加载 class ⽂件到内存 时,虚拟机会将注解去掉,从⽽在程序中不能访问 ➢程序运⾏期间: 当在⼀个注解类前定义⼀个 @Retention(RetentionPolicy.RUNTIME)的注 解,那么说明该注解在程序运⾏期间都会存在内存当中。此时,我们可以通过 反射来获得定义在某个类上的所有注解
p 注解⼤多是⽤做对某个类、⽅法、字段进⾏说明,标识的。 以便在程序运⾏期间我们通过反射获得该字段或⽅法的注解 的实例,来决定该做些什么处理或不该进⾏什么处理 p 注解的使⽤分为三个过程:定义注解-->声明注解-->得到注解
p ⼀个简单的注解: public @interface Annotation01 { //定义公共的 final 静态属性 ……
//定义公共的抽象⽅法 …… } p 注解的成员:注解和接⼜相似,它只能定义 final 静态属性和公共抽象⽅法 p 注解的⽅法: ➢⽅法前默认会加上 public abstract ➢在声明⽅法时可以定义⽅法的默认返回值,如: String color() default “blue”; String color() default {“blue”, “red”, ……} ➢⽅法的返回值的类型:可以有8种基本类型(byte, short, int, long, float, double, boolean, char,)、String、Class、枚举、注解及这些类型的数组
None
ဳᥴ॒ቘᔄପ(java.lang.reflect.AnnotatedElement)ғ ̴java.lang.reflect ۱ӥԆᥝ۱ތӞԶਫሿݍۑᚆጱૡٍᔄ҅ਫᴬӤ҅java.lang.reflect ۱ಅํ׀ጱݍAPIಘ شԧݐᬩᤈAnnotationמ௳ጱᚆێ̶ ̴̴AnnotatedElement ളݗฎಅํᑕଧزᔰҁClass̵MethodConstructor҂ጱᆿളݗ҅ಅզᑕଧ᭗ᬦݍ឴ ݐԧӻᔄጱAnnotatedElementԏݸ҅ᑕଧ੪ݢզ᧣አᧆጱইӥࢥӻӻොဩᦢᳯAnnotationמ௳ғ ̴̴ොဩ1ғ<T extends
Annotation> T getAnnotation(Class<T> annotationClass): ᬬࢧදᑕଧزᔰӤਂࣁጱ̵ ਧᔄࣳጱဳᥴ҅ইຎᧆᔄࣳဳᥴӧਂࣁ҅ڞᬬࢧnull̶ ̴̴ොဩ2ғAnnotation[] getAnnotations():ᬬࢧᧆᑕଧزᔰӤਂࣁጱಅํဳᥴ̶ ̴̴ොဩ3ғboolean is AnnotationPresent(Class<?extends Annotation> annotationClass):ڣෙᧆᑕଧزᔰӤฎ ވ۱ތਧᔄࣳጱဳᥴ҅ਂࣁڞᬬࢧtrue҅ވڞᬬࢧfalse. ̴̴ොဩ4ғAnnotation[] getDeclaredAnnotations()ғᬬࢧፗളਂࣁԭྌزᔰӤጱಅํဳ᯽̶ӨྌളݗӾጱٌ՜ ොဩӧݶ҅ᧆොဩਖ਼ኼᖀಥጱဳ᯽̶ҁইຎဌํဳ᯽ፗളਂࣁԭྌزᔰӤ҅ڞᬬࢧᳩଶԅᵭጱӞӻහᕟ̶҂ᧆ ොဩጱ᧣አᘏݢզᵋץදᬬࢧጱහᕟҔᬯӧտٌ՜᧣አᘏᬬࢧጱහᕟԾኞձ֜ߥ̶
http://git.meiyou.im/Android/Android/wikis/annotation Show Me The Code:
ᬩᤈဳ᯽्กғ
None
None
ဳᥴጱړᔄғ ݐጱොୗӤ᧔҅ဳᥴݢզړ౮ӷᔄ——ᖫᦲဳᥴ ᬩᤈဳᥴ
ᬩᤈဳᥴ ᬩᤈဳᥴᤒᐏ֦ݝᚆࣁᑕଧᬩᤈ݄֢ਙ҅ᮎெԍᚆࣁᬩᤈ݄֢ޫҘ உᓌܔֵ҅አݍ̶ َࣳғRetrofit ҅ORMLite http://git.meiyou.im/Android/jet
ᖫᦲဳᥴ ࢩԅᬩᤈဳᥴླᒌฎࣁᑕଧᬩᤈ݄ᬰᤈ֢ጱ҅አکԧݍ҅ࣁපሲොᶎտํӞਧഖᘙ̶ࢩྌ᭄ ᚆጱๅग़ֵአԧAPTҔ َࣳғ dagger ҅ butterKnife APTጱقᑍฎAnnotation Processing Tool҅Java5ত҅JDK੪ᛔଃԧဳᥴ॒ቘ
APT̶Ԇᥝአԭࣁᖫᦲ๗໑ഝӧݶጱဳᥴᔄኞ౮ᘏץදդᎱ̶APTᬩᤈԭᇿᒈጱJVM ᬰᑕӾҁᖫᦲԏڹ҂҅ଚӬࣁӞེᖫᦲᬦᑕӾݢզտᤩग़ེ᧣አ̶
໐ஞ੪ฎғ ᖫᦲݐဳᥴ҄APT҄ۖாኞ౮რդᎱ
Show Me The Code: http://git.meiyou.im/Android/Android/wikis/apt%E4%BD%BF%E7%94%A8demo
ՋԍฎAopᖫᑕ AOPԅAspect Oriented Programmingጱᖽٟ҅ԅғᶎݻڔᶎᖫᑕ҅᭗ᬦᶼᖫᦲොୗ ᬩᤈ๗ۖாդቘਫሿᑕଧۑᚆጱᕹӞᖌಷጱӞᐿದ̶
None
ଉᥠጱֵአ࣋ว ᚆፊഴ: ࣁොဩ᧣አڹݸᦕ୯᧣አᳵ҅ොဩಗᤈॡᳩ᩻ಸᦄ̶ ᖨਂդቘ: ᖨਂොဩጱᬬࢧ҅ӥེಗᤈᧆොဩ҅ፗളᖨਂ᯾឴ݐ̶ կᏈᥴ: ֵአAOPץදկጱḵᦤᔄጱڣෙ᭦ᬋ̶ ᦕ୯෭ப: ࣁොဩಗᤈڹݸᦕ୯ᔮᕹ෭ப̶ ૡ֢ၞᔮᕹ:
ૡ֢ၞᔮᕹᵱᥝਖ਼ӱۓդᎱၞᑕකդᎱႰݳࣁӞ᩸ಗᤈ҅ᮎԍ౯ժݢզֵአAOPਖ਼ٌړᐶ҅ ଚۖா೯ളӱۓ̶ ᴴḵᦤ: ොဩಗᤈڹḵᦤฎވํᴴಗᤈ୮ڹොဩ҅ဌํڞಲڊဌํᴴಗᤈଉ҅ኧӱۓդᎱഔ̶
None
JAVAӾAopጱٍ֛ਫሿොୗ 1̵JDKۖாդቘ java᭗ᬦਫሿInvocationHandlerളݗ҅ݢզਫሿӞӻᔄጱۖாդቘ҅᭗ᬦۖாդቘ҅౯ժ ݢզኞ౮դቘᔄᘒࣁդቘᔄොဩӾ҅ࣁಗᤈᤩդቘᔄොဩڹݸ҅Ⴒےᛔ૩ጱਫሿٖ҅ ᘒਫሿAop̶ սᅩғۖாդቘjavaᛔඪ೮҅ӧᵱᥝفक़᮱ପ҅ࣁᬩᤈ๗᭗ᬦളݗۖாኞ౮դቘᔄ ᗌᅩғḒضդቘᔄᶳਫሿӞӻളݗ҅ইຎဌਫሿളݗտಲڊӞӻଉ̶ᒫԫᚆߥ҅ࢩ ԅۖாդቘֵአݍጱګਫሿጱ҅Ḓضݍᙗਧྲፗള᧣አᥝౌ http://rejoy.iteye.com/blog/1627405
2̵ۖாਁᜓᎱኞ౮CGLib ࣁᬩᤈ๗҅ፓຽᔄےݸ҅ۖாୌਁᜓᎱկኞ౮ፓຽᔄጱৼᔄ҅ਖ਼ڔᶎ᭦ᬋےفکৼᔄӾ҅ဌํളݗԞݢզᕢف҅ ֕ಘᔄጱਫֺොဩԅfinal҅ڞ෫ဩᬰᤈᕢف̶ ݢզֵአCglibਫሿۖாਁᜓᎱኞ౮҅ᬯฎӞӻ୩य़ጱ҅ṛᚆ҅ṛᨶᰁጱCodeኞ౮ᔄପ҅ਙݢզࣁᬩᤈ๗ಘJava ᔄӨਫሿJavaളݗ̶CGLIB۱ጱବ੶ฎ᭗ᬦֵአӞӻੜᘒளጱਁᜓᎱ॒ቘຝASM҅ഘਁᜓᎱଚኞ౮ෛጱᔄ̶ սᅩғݢզᕢفဌํളݗጱᔄҔᬩᤈኞ౮҅ٺӧᥝጱኞ౮ᲀҔ᭗ᬦਁᜓᎱኞ౮ৼᔄ҅ᘒӧฎݍොୗ݄᧣አդ ቘᔄ ᗌᅩғӧᚆᕢفfinalොဩҔᬩᤈኞ౮ৼᔄ҅᧔กտํኞ౮ᲀ҅ଚӬݢᚆኞ౮य़ᰁৼᔄ http://blog.csdn.net/zghwaicsdn/article/details/50957474
3̵ᛔਧԎᔄے,Javassist ࣁᬩᤈ๗҅ፓຽےڹ҅ਖ਼ڔᶎ᭦ᬋےکፓຽਁᜓᎱ᯾̶ ݢզᕷय़᮱ړᔄᬰᤈᕢف҅֕դᎱӾইຎֵአԧٌ՜ᔄے҅ڞᬯԶᔄਖ਼ӧտᤩᕢف̶ JavassistฎӞӻᖫᬋਁᜓᎱጱຝ҅ݢզᦏ֦உᓌܔࣈ֢ਁᜓᎱ̶ਙݢզࣁᬩᤈ๗ਧԎץදClass̶ֵአ JavassistਫሿAOPጱܻቘฎࣁਁᜓᎱےڹፗളץදᵱᥝڔفጱොဩ̶ᬯྲֵአCglibਫሿAOPๅےṛප҅ଚ Ӭဌॡग़ᴴګ. սᅩғݢզᕢفᕷय़᮱ړᔄҔᬩᤈኞ౮҅ٺӧᥝጱኞ౮ᲀҔ᭗ᬦਖ਼ڔᶎ᭦ᬋٟفਁᜓᎱ҅ٺԧኞ౮ ৼᔄጱᲀ҅ӧտԾኞᬦग़ৼᔄ ᗌᅩғᬩᤈےفڔᶎ᭦ᬋ҅ԾኞᲀҔྲCgLibౌᅩ դᤒຝғᅾץ॔ຝHotFix
̵CDNے᭛ᒵ http://yonglin4605.iteye.com/blog/1396494
4̵ASM ASM ฎӞӻ Java ਁᜓᎱഴຝ̶ਙᚆड़զԫᬰګ୵ୗץද૪ํᔄᘏۖாኞ౮ᔄ̶ASM ݢզፗളԾኞԫ ᬰګ class կ҅Ԟݢզࣁᔄᤩےف Java
ᡦԏڹۖாදݒᔄᤈԅ̶ASM ᔄկӾفמ௳ݸ҅ᚆड़ දݒᔄᤈԅ҅ړຉᔄמ௳҅ኜᛗᚆड़໑ഝአಁᥝኞ౮ෛᔄ̶ Ӥᶎጱൈᬿݢզ፡ڊ҅ASMݢզࣁᖫᦲ๗ፗളץදᖫᦲڊጱਁᜓᎱկ҅Ԟݢզ؟javassitӞ҅ࣁᬩᤈ ๗҅ᔄկےڹ݄҅ץදਁᜓᎱ̶ӷᘏጱ܄ڦࣁԭ҅Ӟӻਖ਼ಅํᵱᥝAOPጱᔄ᮷Ԫضץදԧ҅Ӟӻࣁᬩᤈ ᵱᥝ݄ץද̶ սᅩғݢզᕢفᕷಅํᔄҔӷᘏኞ౮ොୗ҅ݢզ໑ഝᵱᭌೠ ᗌᅩғץදਁᜓᎱ҅ᵱᥝclassկྲᆧఀ҅ᖫٟᬦᑕ॔ http://www.cnblogs.com/mosthink/p/6295806.html
5̵AspectJ AspectJฎӞӻᶎݻڔᶎጱຝ҅ਙಘԧJava̶AspectJਧԎԧAOPဩಅզਙํӞӻӫᳪጱᖫᦲአኞ ౮᭽ਝJavaਁᜓᖫᎱᥢጱClassկ̶ྲ౮ᆧ҅ࣁJava WebݎӾय़ᰁֵአ̶ ASMӞ҅Aspectjํᶉாᖫᦲۖாᖫᦲጱսᅩ҅׀ᑕଧާᭌೠ̶ݚक़AspectjٌᖫᎱๅԅᓌ၄҅ฎAndroid ݎӾ҅ਫሿAOPጱḒᭌ̶ սᅩғݢզᕢفᕷಅํᔄҔӷᘏኞ౮ොୗ҅ݢզ໑ഝᵱᭌೠҔᖫٟᓌܔ҅ۑᚆ୩य़ ᗌᅩғᵱᥝֵአajcᖫᦲᖫᦲ҅ajcᖫᦲฎjavaᖫᦲጱಘٍ҅ํٌಅํۑᚆ դᤒຝғ Hugo(Jake
Wharton) , http://git.meiyou.im/Android/JetAop
6̵APT ᛔਧԎӞӻAbstractProcessor҅ࣁᖫᦲ๗݄ᥴຉᖫᦲጱᔄ҅ଚӬ໑ഝᵱኞ౮Ӟӻਫሿԧᇙਧളݗጱৼᔄ(դ ቘᔄ)҅JDKۖாդቘӧݶጱฎ҅դቘᔄฎࣁᖫᦲ๗ኞ౮ጱ̶ଉᥠጱӞԶAndroidጱIOCຝӾํय़ᰁଫአ (੪ฎ᭗ᬦဳᥴդ๊findviewbyidᒵොဩ)̶ սᅩғݢզᕢفᕷಅํᔄҔᖫᦲ๗դቘ҅ٺᬩᤈၾᘙ ᗌᅩғᵱᥝֵአaptᖫᦲᖫᦲҔᵱᥝಋۖ೪ളդቘጱդᎱ(ٌਫฎෆӻਁᒧԀ)Ҕኞ౮य़ᰁդቘᔄ դᤒຝғDataBinding,Dagger2, ButterKnife, EventBus3 ̵DBFlow̵AndroidAnnotation
ٌ՜ጱӞԶૡٍғ DexMaker: Dalvik ᡦӤ҅ࣁᖫᦲ๗ᘏᬩᤈኞ౮դᎱጱ Java API̶ ASMDEX: Ӟӻᔄ֒ ASM ጱਁᜓᎱ֢ପ҅ᬩᤈࣁAndroidଘݣ֢҅DexਁᜓᎱ̶
xposed: ᵱᥝroot ฎࢩԅਙᥝۙ೮zygoteᬰᑕhookᔮᕹොဩҔ Dexposed: ᴨ᯾ਫሿ҅Dexposedඪ೮Android2.3ک4.4 ,Dalvik Byte Buddy byte-buddy ҁݩᑍᚆ๋ளጱҔ Mockito, Hibernate, Google's Bazel build system ҂ Proxetta jodd ̶̶̶̶ See More: https://stackoverflow.com/questions/2261947/are-there-alternatives-to-cglib
ඪ೮ጱᔮᕹᇇғ Dalvik 2.3 Dalvik 4.0~4.4 ӧඪ೮ጱᔮᕹᇇғ Dalvik 3.0 ART 5.1
ART M ၥᦶӾጱᔮᕹᇇғ ART 5.0 ๚ᕪၥᦶጱᔮᕹᇇғ Dalvik 2.2 Dexposed
AspectJฎEclipseڊߝጱAopຝ҅ݢզଆۗ౯ժᬰᤈஉොጱAopᖫᑕ ਥᗑ᱾ള: http://www.eclipse.org/aspectj/ սᅩ ෫ف ԟ౮֗ ඪ೮ݱᐿ໒ୗ҅ଚӬஉ౮ᆧ
None
None
ᓌܔቘᥴғ ࣁAspectJӾ҅ૡ֢ၞᑕԅғ 1. ತݢզൊفጱᅩҁjoinPoint) 2. ౯੪ൊᬯԧҁPointCut҂ 3. ౯ᥝൊՋԍҁAdvice҂҅ ԆᥝฎൊفᬯԶොဩғ a.
BeforeҁڹᶎଗՋԍ҂҅ b. AfterҁݸᶎଗՋԍ҂҅ c. Aroundҁፗളഘԧ, አ౯ጱ᭦ᬋ҂
Show Me The Code http://git.meiyou.im/Android/Android/wikis/aspectjdemo
THANKS