At JavaZone 2010 I will be giving a lightning talk on APIs that use dynamic subclasses. These APIs make it possible to do things in Java that seem like pure magic. Here are some ideas of what you can get from these APIs and a look under the hood, so you really understand what’s going on.Mockito – “the best Java library named after a summery drink”Mocking is a hotly debated subject within testing camps. I think a lot of the arguments come against mocking (beyond overuse…) come down to the fact that the last generation of mocking libraries left a lot to be desired. A desire that has been fulfilled by Mockito.I will leave the examples at a minimum, but here’s an example from code I actually use a lot. Mocking the servlet API: HttpServletRequest req <span style="color: #339933;">=</span> mock<span style="color: #009900;">(</span>HttpServletRequest.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> HttpServletResponse resp <span style="color: #339933;">=</span> mock<span style="color: #009900;">(</span>HttpServletResponse.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> when<span style="color: #009900;">(</span>req.<span style="color: #006633;">getMethod</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span>.<span style="color: #006633;">thenReturn</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"GET"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> servletUnderTest.<span style="color: #006633;">service</span><span style="color: #009900;">(</span>req, resp<span style="color: #009900;">)</span><span style="color: #339933;">;</span> verify<span style="color: #009900;">(</span>resp<span style="color: #009900;">)</span>.<span style="color: #006633;">setContentType</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"text/html"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>For those of you who’ve struggled with jMock or it’s ilk, you may notice the concise syntax used to specify behavior (“when(…).thenReturn()”) and the fact that you don’t have to set up expectations before exercising the code.LambdaJ – “making Java beautiful and incomprehensible”LambdaJ pretty much starts with the realizations that waiting for new language features like closures may prove to be a very long wait indeed. Furthermore, anonymous inner classes may technically be used to simulate closures, but they are so ugly that not even a mother could love them.Let’s look at an example: Finding the name of every member of the Simpsons family who’s older than 8, in order of age. In plain Java:<span style="color: #003399;">List</span><span style="color: #009900;">[</span>Person<span style="color: #009900;">]</span> tmp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">[</span>Person<span style="color: #009900;">]</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span>Person p <span style="color: #339933;">:</span> theSimpsons<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">(</span>p.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">></span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">)</span> tmp.<span style="color: #006633;">add</span><span style="color: #009900;">(</span>p<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #003399;">Collections</span>.<span style="color: #006633;">sort</span><span style="color: #009900;">(</span>tmp, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Comparator</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> compare<span style="color: #009900;">(</span>Person a, Person b<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">return</span> a.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">-</span> b.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #003399;">List</span><span style="color: #009900;">[</span><span style="color: #003399;">String</span><span style="color: #009900;">]</span> names <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">[</span><span style="color: #003399;">String</span><span style="color: #009900;">]</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span>Person p <span style="color: #339933;">:</span> tmp<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> names.<span style="color: #006633;">add</span><span style="color: #009900;">(</span>p.<span style="color: #006633;">getName</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">(</span>names<span style="color: #009900;">)</span><span style="color: #339933;">;</span>More modern languages are way ahead of Java. Here’s Ruby:<span style="color:#CC0066; font-weight:bold;">puts</span> theSimpsons.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#006600; font-weight:bold;">{</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">age</span> <span style="color:#006600; font-weight:bold;">></span> <span style="color:#006666;">8</span> <span style="color:#006600; font-weight:bold;">}</span>.<span style="color:#9900CC;">sort_by</span><span style="color:#006600; font-weight:bold;">(</span><span style="color:#006600; font-weight:bold;">&</span>:age<span style="color:#006600; font-weight:bold;">)</span>. <span style="color:#9900CC;">collect</span> <span style="color:#006600; font-weight:bold;">{</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">name</span> <span style="color:#006600; font-weight:bold;">}</span>The rather simple request is simple to express. Yay! Java 7 may make this better.<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">(</span>theSimpsons.<span style="color: #006633;">select</span><span style="color: #009900;">(</span>#<span style="color: #009900;">(</span>Person p<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">return</span> p.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">></span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span>.<span style="color: #006633;">sort_by</span><span style="color: #009900;">(</span>#<span style="color: #009900;">(</span>Person p<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">return</span> p.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span>.<span style="color: #006633;">collect</span><span style="color: #009900;">(</span>#<span style="color: #009900;">(</span>Person p<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">return</span> p.<span style="color: #006633;">getName</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>All in all, not a bad contender. What about LambdaJ:<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">(</span>with<span style="color: #009900;">(</span>theSimpsons<span style="color: #009900;">)</span> .<span style="color: #006633;">retain</span><span style="color: #009900;">(</span>having<span style="color: #009900;">(</span>on<span style="color: #009900;">(</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span>.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>, gt<span style="color: #009900;">(</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> .<span style="color: #006633;">sort</span><span style="color: #009900;">(</span>on<span style="color: #009900;">(</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span>.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> .<span style="color: #006633;">extract</span><span style="color: #009900;">(</span>on<span style="color: #009900;">(</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>It’s not perfect, but it has one thing to recommend it: This works with standard, everyday Java, today! There’s no special compilation crap. No other language. Nothin. Just plain old Java. (Thanks to Mario Fusco for improving the example with LamdbaJ 2.3 syntax)What’s going onBoth LambdaJ and Mockito use a tricky sleight-of-hand: Generate a dynamic subclass which records its method invocations for later use. Creating such an API is in principle easy, although my implementation leave a lot! of details unimplemented.So: We want invocations on the generated class to be template/mock objects to be saved: @Test <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shouldRecordInvocations<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">{</span> Person template <span style="color: #339933;">=</span> DynSubclassDemo.<span style="color: #006633;">on</span><span style="color: #009900;">(</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> assertNull<span style="color: #009900;">(</span>DynSubclassDemo.<span style="color: #006633;">lastMethodCall</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> template.<span style="color: #006633;">getAge</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> assertEquals<span style="color: #009900;">(</span><span style="color: #0000ff;">"getAge"</span>, DynSubclassDemo.<span style="color: #006633;">lastMethodCall</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span>This magic is surprisingly easy to implement with CgLib:@SuppressWarnings<span style="color: #009900;">(</span><span style="color: #0000ff;">"unchecked"</span><span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">Object</span> on<span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">Class</span> templateClass<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000000; font-weight: bold;">return</span> Enhancer.<span style="color: #006633;">create</span><span style="color: #009900;">(</span>templateClass, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InvocationHandler</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> @Override <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> invoke<span style="color: #009900;">(</span><span style="color: #003399;">Object</span> o, <span style="color: #003399;">Method</span> m, <span style="color: #003399;">Object</span><span style="color: #009900;">[</span><span style="color: #009900;">]</span> a<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> lastMethodCall <span style="color: #339933;">=</span> m<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span>This creates a subclass of the template class (in this case: Person). But every method in Person is overridden by calling the invocation handler. Which simply saves what method was called.This makes it possible to implement a prototype of LambdaJ’s collect method: @Test <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shouldCallRecordedMethodForEveryObject<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> names <span style="color: #339933;">=</span> DynSubclassDemo.<span style="color: #006633;">collect</span><span style="color: #009900;">(</span>theSimpsons, DynSubclassDemo.<span style="color: #006633;">on</span><span style="color: #009900;">(</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">)</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> assertEquals<span style="color: #009900;">(</span>names, asList<span style="color: #009900;">(</span><span style="color: #0000ff;">"Lisa"</span>, <span style="color: #0000ff;">"Homer"</span>, <span style="color: #0000ff;">"Marge"</span>, ...<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span><span style="color: #009900;">[</span>T ,U<span style="color: #009900;">]</span> <span style="color: #003399;">List</span><span style="color: #009900;">[</span>U<span style="color: #009900;">]</span> collect<span style="color: #009900;">(</span>Iterable<span style="color: #009900;">[</span>T<span style="color: #009900;">]</span> c, U property<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">[</span>U<span style="color: #009900;">]</span> result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">[</span>U<span style="color: #009900;">]</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span>T t <span style="color: #339933;">:</span> c<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #666666; font-style: italic;">// An insane amount of exception handling removed</span> result.<span style="color: #006633;">add</span><span style="color: #009900;">(</span><span style="color: #009900;">(</span>U<span style="color: #009900;">)</span> lastMethodCall.<span style="color: #006633;">invoke</span><span style="color: #009900;">(</span>t<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">return</span> result<span style="color: #339933;">;</span> <span style="color: #009900;">}</span>This is a gross simplification. LambdaJ handles many aspects that my prototype simple ignores: Chained method calls, multithreading, method arguments, and multiple invocations on the same line.The future of JavaMaybe the future of Java isn’t extending the language. Maybe the future of Java isn’t replacing the language with Scala. Maybe the future of Java is smart people discovering smarter ways of using what’s already there. My hat off to Mario Fusco, Szczepan Faber and everybody who’s contributed to LambdaJ or Mockito.Come to my talk at JavaZone to learn more! Java