Skip to main content

Instrumentation with ByteBuddy

Simple Story

A Java agent inspects and rewrites every class as it is loaded, before any of it runs.

That is a far better place for the teacher to stand than the compiler, because by then you see classes you never compiled, including Java's own.

What it is

The java.lang.instrument application programming interface (API) lets an agent, attached with -javaagent, transform class bytes as classes are loaded. Byte Buddy is the library Ares uses to express those transformations without writing bytecode by hand.

How Ares 2 uses it

This is the second enforcement backend, selected by the INSTRUMENTATION half of the programming language configuration. JavaInstrumentationAgent is the Premain-Class of the published agent classifier, so an exercise consumes a JAR that already carries the right manifest.

The advice classes go on the bootstrap append path. Advice woven into a bootstrap class has to be reachable from a class loaded by the bootstrap loader, which the ordinary application classpath is not.

Several --add-opens and --add-exports flags are required for the same reason: the agent reaches into Java Development Kit (JDK) internals that the module system closes by default.

Why it reaches further than call-site weaving

Rewriting the target rather than the caller means every route to the method is covered at once, including reflective and library-mediated ones. Coverage becomes a property of the target, not an enumeration of call sites.

Further reading