>So getting this to work would need some form of reflection (to get the
right type at runtime based on the Java version)
Reflection is sufficient, isn't it?
I think reflection would be rather clean solution here.
It is more IDE-friendly and developer-friendly than pre-processing.
Reflection is much easier to debug than byte-code generation.
So, do you see drawbacks with using reflection to select the specific
implementation?
From implementation point of view it just replaces "preprocessing"
with some "Class.forName" and that is it.
It even allows to ship the same jar file and select implementation on the fly.
Vladimir