Obfuscators change method names.
This means method name lookups fail when using dynamic invocation techniques (which I do a *lot* in non-trivial programming - its what makes OO development really powerful). So any code that works well with obfuscation is going to be 100% statically bound - you might as well write it in C or maybe C++ then.
Apple ported WebObjects and their OR Mapping framework to Java then released that. An hour of machine time later and I have the source code. If you look around the code a bit you find extensive use of dynamic invocation - obfuscation would break the code.
I think this is typical of the more powerful software.