Clamp does assume an ahead-of-time model in terms of its setuptools integration. However, you should just be able to use Clamp as is for your case, with a little ClassLoader work.
This is because of the two steps used by Clamp:
1. CustomMaker.makeClass, as seen in clamp.proxymaker - this ensures that class is built just once for a given name resolvable by Py.findClass. However this is not the same class loading resolution as Class.forName, so this is where you will have to do some extra work, as explained below.
2. CustomMaker.saveBytes uses the builder returned by clamp.build.get_builder, which by default - unless in a setuptools build step - is going to be a NullBuilder, which simply doesn't write out the proxy bytecode. This saveBytes step is ordinarily to ensure that you have class bytes for a jar you will distribute for say every node in your Storm cluster - not applicable in your case.
With that in mind, here's the small amount of extra work you should have to do. For your Java code to get Class.forName resolvability of clamped Python classes not built ahead-of-time, you will need to use Thread.setContextClassLoader (or something comparable, class loading has a number of entry points) and set it to the same ClassLoader that Py.findClassInternal would choose. If you look at that code in org.python.core.Py
, it's quite straightforward, so I'm not certain why don't expose it directly.
Hope that helps!