weaving technologies
play

Weaving technologies Comparison of different weaving approaches - PowerPoint PPT Presentation

Weaving technologies Comparison of different weaving approaches http://techblog.karsten-becker.de 1 Bio Professional Studies Siemens CT SE2 TUHH Eclipse RCP General engineering IBM Rational science HAW Hamburg


  1. Weaving technologies Comparison of different weaving approaches http://techblog.karsten-becker.de 1

  2. Bio Professional Studies ● Siemens CT SE2 ● TUHH – Eclipse RCP – General engineering ● IBM Rational science ● HAW Hamburg Reasearch – Computer – Eclipse JDT Engineering Refactoring http://techblog.karsten-becker.de 2

  3. Overview ● Used Terminology ● Offline weaving (static weaving) ● Load-time weaving ● Online weaving (dynamic weaving) http://techblog.karsten-becker.de 3

  4. Terminology ● Advice – Code that will be inserted at a joinpoint – Often defined as „regular“ Java code ● Joinpoint – Point in control flow of a application ● before/after/around method/field access/constructor ● Pointcut – Collection of joinpoints – Often matched via regular expressions http://techblog.karsten-becker.de 4

  5. Terminology ● Aspect – Collection of advices that are assigned to joinpoints using pointcuts ● Weaving – Process of applying an Aspect to an existing application – Usually involves modification of bytecode http://techblog.karsten-becker.de 5

  6. Offline weaving Offline weaving ● Bytecode information ● Bytecode manipulation tools ● General weaving process http://techblog.karsten-becker.de 6

  7. Bytecode information Example Application: public class Hello { public static void main(String[] args) { System. out .println("Hello Welt"); } } http://techblog.karsten-becker.de 7

  8. Bytecode Information public static main(String[]) : void L0 (0) LINENUMBER 5 L0 GETSTATIC System.out : PrintStream LDC "Hello Welt" INVOKEVIRTUAL PrintStream.println(String) : void L1 (4) LINENUMBER 6 L1 RETURN L2 (6) LOCALVARIABLE args String[] L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1 http://techblog.karsten-becker.de 8

  9. Java Virtual Machine ● Stack driven – Invocation ● Pushes parameters ● (Pops result) – Execution ● Pops parameters ● Pushs result ● Execution Modes – Interpreted – Compiled ● Baseline compiled ● Optimised compiled Demo with bytecode outline http://techblog.karsten-becker.de 9

  10. Bytecode Modification Structures that need updates ● Constant pool – String references to classes – Literals ● References to Labels ● MaxStack ● MaxLocals ● Exceptions table ● Attributes http://techblog.karsten-becker.de 10

  11. BCEL Example ● Insert „before“ advice ● Insert „after“ advice public class TestClass { public static void main(String[] args) { if (args.length == 0) return ; System. out .print("World"); } } http://techblog.karsten-becker.de 11

  12. BCEL Example JavaClass testClass = Repository.lookupClass("TestClass"); Method[] methods = testClass.getMethods(); ClassGen gen = new ClassGen(testClass); InstructionFactory factory = new InstructionFactory(gen); ● Loading Class into special representation ● Can not modify already loaded classes! http://techblog.karsten-becker.de 12

  13. BCEL Code print Calling getCode on Method object Code(max_stack = 2 , max_locals = 1 , code_length = 15) 0: aload_0 1: array length 2: ifne #6 5: return 6: getstatic java.lang.System.out Ljava/io/PrintStream ; (22) 9: ldc "World" (24) 11: invokevirtual java.io.PrintStream.print(Ljava/lang/String;)V (30) 14: return http://techblog.karsten-becker.de 13

  14. BCEL Insert before MethodGen mg = new MethodGen(method,TestClass.getClassName(), gen .getConstantPool()); InstructionList original = mg.getInstructionList(); InvokeInstruction before = factory.createInvoke(Aspect. class .getName(), "before", Type.VOID, new Type[0], Constants.INVOKESTATIC); original.insert(before); mg.setMaxLocals(); mg.setMaxStack(); Method newMethod = mg.getMethod(); http://techblog.karsten-becker.de 14

  15. BCEL Code print Calling getCode again Code(max_stack = 2, max_locals = 1, code_length = 18) 0: invokestatic offline.general.bcel.Aspect.before ()V (39) 3: aload_0 4: arraylength 5: ifne #9 8: return 9: getstatic java.lang.System.out Ljava/io/PrintStream; (22) 12: ldc "World" (24) 14: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V (30) 17: return http://techblog.karsten-becker.de 15

  16. BCEL Insert after InstructionList original = mg.getInstructionList(); InstructionHandle[] handles = original.getInstructionHandles(); for (InstructionHandle handle : handles) { if (handle.getInstruction() .equals(InstructionConstants.RETURN)) { InvokeInstruction after = factory.createInvoke( Aspect. class .getName(), "after", Type.VOID, new Type[0], Constants.INVOKESTATIC); original.insert(handle, after); } } http://techblog.karsten-becker.de 16

  17. Load-time weaving Load-Time weaving ● How it works ● Possibilites ● Restrictions http://techblog.karsten-becker.de 17

  18. Load time weaving?! ● Bytecode manipulation same as offline – Often BCEL, ASM.. ● Configuration often through XML http://techblog.karsten-becker.de 18

  19. LTW in AspectJ public class TestClass { public static void main(String[] args) throws Exception { ClassLoader parent = ClassLoader. getSystemClassLoader (); ClassLoader cl = new WeavingURLClassLoader(parent); Class<?> loadClass = cl.loadClass("net.kbsvn.ltw.HelloClass"); ISayHello hc=(ISayHello) loadClass.newInstance(); hc.sayHello(); } } public interface ISayHello { public void sayHello(); } http://techblog.karsten-becker.de 19

  20. Possibilites for ClassLoader ● Redefine Systemclassloader through define – -Djava.system.class.loader ● Replace ClassLoader through hotswap – JVM needs to run in debug modus ● Replace ClassLoader in rt.jar – -Xbootclasspath http://techblog.karsten-becker.de 20

  21. Restrictions and side-effects ● Only classes loaded through ClassLoader – Due to parent first paradigma to be woven code may not lie within ClassPath ● Classes already loaded can not be woven ● Only aspects that are loaded can be applied – No loading of aspects during runtime ● No classes from rt.jar – Loaded through boostrap CL http://techblog.karsten-becker.de 21

  22. Online Weaving ● Through Proxies – Spring – JBoss ● Through JVMDI&JVMTI – Prose – Spring (agent) – JBoss (agent) ● Through deep JVM support – Steamloom – JRockit? http://techblog.karsten-becker.de 22

  23. Proxies ● In Java since 1.3 ● During runtime created ● Use interfaces for method signatures ● Dispatch invocations to single method – InvocationHandler#invoke() http://techblog.karsten-becker.de 23

  24. Proxies advantages ● Advice lookup during runtime – Very easy to make dynamic ● Supported in every JVM ● Support before, after, around with modification of result http://techblog.karsten-becker.de 24

  25. Proxies disadvantage ● Classes are not the same – Problems with annotations – getClass() name differs ● No support for field access ● Small performance penalty ● No Call support http://techblog.karsten-becker.de 25

  26. JVMDI&JVMTI ● Support through – Breakpoint (JVMDI) – General invocation notification (JVMTI) – Bytecode redefinition (JVMTI & JVMDI) ● Requires some support in JVM – Most JVMs support both ● Requires native Code – Portability issues ● Requires access to JVM commandline – Not always easy in J2EE ● Have access to all classes http://techblog.karsten-becker.de 26

  27. JVMDI&JVMTI ● Lowers overall performance – JVMDI needs Debug mode of JVM ● No penalty for client VM ● Up to 20% penalty for server VM – Redefinition of Class break optimisation level ● Only partial support for Intertype definition ● Not more than 1 supported – In Java6 this restriction has been changed http://techblog.karsten-becker.de 27

  28. Deep JVM support ● Steamloom – Works for jikes RVM on linux – Performance close to aspectJ static ● Faster! for cflow ● Faster Advice instance lookup – No double book-keeping ● Required information already included in Class objects ● JRockit – Not much known – Subscriber kind of weaving http://techblog.karsten-becker.de 28

  29. Ready to go, or questions? Any questions, or ready for deep JVM support? http://techblog.karsten-becker.de 29

  30. Jikes RVM ● Research Virtual Machine – Written in Java ● Selfhosted – No interpreted mode – 2 JIT Compiler ● Basline JIT ● Adaptive Optimisation System http://techblog.karsten-becker.de 30

  31. Jikes RVM ● Method are replaced by lazy compilation stubs ● Lazy compilation stub triggers compilation of real bytecode – Done using Baseline compiler ● Stupid but blazing fast ● Optimised Compiler performs basic optimisation ● Adaptive Compiler compiles profile based optimised code http://techblog.karsten-becker.de 31

  32. Steamloom ● Replaces Compilers – Additional information about method ● Inline places ● BAT compatible Class structure ● Advice deployment – Weaves method bytecode using BAT – Flag method for recompilation ● Advice undeployment – Unweave method bytecode using BAT – Flag method for recompilation http://techblog.karsten-becker.de 32

  33. Steamloom API ● Interfaced using regular Java ● http://techblog.karsten-becker.de 33

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend