Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Android Annotation And AspectJ
Search
Tony
June 28, 2017
Technology
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Android Annotation And AspectJ
Android Annotation And AspectJ
Tony
June 28, 2017
Other Decks in Technology
See All in Technology
しろおびから始める!ログ活用の第一歩
shumei_ito
0
950
JAWS-UGグッズ職人仕事の流儀
kentapapa
0
110
Kiro Crewをはじめよう
kizawa2020
1
160
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
100
サブエージェントと Claude Mods で作る独自 Advisor ツールの話
kenichiodo
2
160
Classmethod Company Deck
satoshi7
1
690
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
250
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
分析AIエージェントを育てる、動く環境を育てる
codatum
1
1.1k
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Building Applications with DynamoDB
mza
96
7.2k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
GitHub's CSS Performance
jonrohan
1033
470k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Being A Developer After 40
akosma
92
590k
30 Presentation Tips
portentint
PRO
1
430
Agile that works and the tools we love
rasmusluckow
331
22k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Writing Fast Ruby
sferik
630
63k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
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