Magic Development with Aspects (AppDevCon 2017)

Magic Development with Aspects (AppDevCon 2017)

Cf95f93e78f6d6dd0630049396f723c6?s=128

Xavier Gouchet

March 16, 2017
Tweet

Transcript

  1. 2.

    About... Xavier F. Gouchet Android Architect Jenkins/Sonar Admin Bash /

    Python tools dev Bad Puns Advocate @xgouchet on Github, StackOverflow, Twitter, …
  2. 3.

    Goal for the afternoon What’s AOP The theory, and motivation

    How does it work A bit of technical details on byte code and compilation Concrete examples The part where you do the work and I relax… or not. @xgouchet
  3. 4.

    “ “Let's start at the very beginning (A very good

    place to start)” Julie Andrews @xgouchet
  4. 5.

    It’s NOT ... ◎ A new programming language ◎ Something

    to replace OOP ◎ The solution to all your problems ! @xgouchet
  5. 6.

    It is a tool to ... ◎ Enhance modularity ◎

    Separate cross cutting concerns ◎ Focus on business logic ◎ Reduce noise in the source code @xgouchet
  6. 9.

    “ “Let me tell you a story (to chill the

    bones)” Iron Maiden @xgouchet
  7. 10.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  8. 11.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  9. 12.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  10. 13.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  11. 14.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  12. 15.

    void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  13. 18.

    input[type=text] { font-family: monospace; } blockquote:before { content: '\201C'; font-size:

    300%; font-family: serif; } #nav-home p { color: #FF4630; cursor: pointer; } .contact img:hover { border: 1px #004080; } CSS + HTML
  14. 19.

    CSS Attributes Changes in appearance applied to … Elements Nodes

    in the source code , defined by … Selectors Rules and patterns @xgouchet
  15. 20.

    “ “If you know how to use CSS, Then you

    know how to use AOP” …me @xgouchet
  16. 21.

    Pointcuts Rules and patterns JoinPoints Positions in the source code

    , defined by … Advices Changes in behavior applied to … Aspects @xgouchet
  17. 27.
  18. 31.

    public Foo(); Signature: ()V Code: Stack=1, Locals=1, Args_size=1 0: aload_0

    1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public java.lang.String getBar(); Signature: ()Ljava/lang/String; Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field bar:Ljava/lang/String; 4: areturn LineNumberTable: line 5: 0 public void setBar(java.lang.String); Signature: (Ljava/lang/String;)V Code: Stack=2, Locals=2, Args_size=2 0: aload_0 1: aload_1 2: putfield #2; //Field bar:Ljava/lang/String; 5: return LineNumberTable: line 8: 0 line 9: 5 } JD-GUI : http://jd.benow.ca/ But what’s going on really ? @xgouchet
  19. 39.

    It’s just the beginning of the journey - Many other

    pointcuts - Inter-type declarations - Change class hierarchy - Add fields - Patch jar files @xgouchet
  20. 41.

    Wizardry or Witchcraft @Aspect public class PreventNPEAspect { @Pointcut("within(com.example.model.*)") public

    void withinModelClass() {} @Around("withinModelClass() && execution(* *(..))") public void advice(ProceeJoinPoint jp) { Object[] args = jp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] == null) { args[i] = ""; } } jp.proceed(args); } }
  21. 42.

    Wizardry or Witchcraft @Aspect public class PreventNPEAspect { @Around("execution(@PreventStringNPE *

    *(..))") public void advice(ProceeJoinPoint jp) { Object[] args = jp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] == null) { args[i] = ""; } } jp.proceed(args); } }
  22. 43.

    “ “I wanna find some answers I wanna ask for

    some help ” Bruce Springsteen @xgouchet
  23. 44.

    FAQ ◎ What about stack traces ? Caused by: java.lang.RuntimeException

    at com.sample.aspectMyAspect.myAdvice(MyAspect.java:666) at com.app.model.Foo.bar(Foo.java:69) at com.app.model.Foo.<init>(Foo.java:42) at java.lang.Class.newInstance(Native Method) <9 more> ◎ What about breakpoints ? Stepping through your code is ok ◎ What about proguard ? Obfuscation performed after weaving @xgouchet
  24. 46.

    Bad practices and code smells ◎ Pokemon (gotta catch’em all)

    ◎ Wizard of Oz (pay no attention to the man behind the curtain) ◎ Dr Octopus (my left tentacle doesn’t know what my right is doin’) ◎ Inception (aspects within aspects …) ◎ MacGyver (the swiss army knife @xgouchet
  25. 47.

    Things to remember ◎ Focus on Cross Cutting concerns ◎

    If you can do it more easily with OOP don’t use AOP ◎ You can only weave code you own @xgouchet
  26. 48.

    Writing Aspects… ◎ Inheritance, abstracts, generics, inner classes… ◎ Unit

    tests ◎ Android flavors ◎ AOP is real programming @xgouchet
  27. 50.

    Useful links ◎ Android AspectJ plugin ◦ https://github.com/deezer/Android-Aspectj-Plugin ◎ Counsel

    ◦ https://github.com/deezer/Counsel ◎ AspectJ Documentation ◦ https://eclipse.org/aspectj/doc/next/progguide/ ◎ Java Bytecode Viewer : JD-GUI ◦ http://jd.benow.ca/ @xgouchet