In most JDO implementations, user-defined persistent classes implement a
special PersistenceCapable interface.
This interface contains many complex methods that enable the JDO
implementation to manage the persistent fields of class instances.
Fortunately, you do not have to implement this interface yourself.
In fact, writing a persistent class in JDO is usually no different than
writing any other class. There are no special parent classes to extend
from, field types to use, or methods to write. This is one important way
in which JDO makes persistence completely transparent to you, the
developer.

4.1. Enhancer

In order to shield you from the intricacies of the
PersistenceCapable interface, JDO
implementations typically provide an enhancer. An
enhancer is a tool that automatically adds code to your persistent
classes after you have written them. Though some vendors may use
source enhancers that modify your Java code, enhancers generally
operate on .class files. They post-process
the bytecode generated by your Java compiler, adding the necessary
fields and methods to implement the expected interface. This bytecode
modification perfectly preserves the line numbers in stack traces
and is compatible with Java debuggers, so enhancement does not affect
debugging.

The diagram above illustrates the compilation of a persistent class.
JDO implementations typically include an Ant task so that you can make
enhancement an automatic part of your build process. Some JDO
implementations may also use custom class loaders or Java 5's class
loading hooks to perform enhancement transparently at runtime, rather
than adding a step to the build process.

Note

Kodo uses bytecode, rather than source code, enhancement.
Kodo offers both a compile-time enhancer tool and a runtime
enhancement option for Java 5 users. See
Section 5.2, “Enhancement” of the Reference Guide.