A Java Obfuscator should offer maximum protection against reverse
engineering, as this is the main reason to buy an obfuscator.
The obfuscator should rename Packages, Classes, Methods and Fields
using aggressive obfuscator techniques
The obfuscator should stop decompilers from producing usable results
The obfuscator should use Advanced Control Flow Obfuscation
String Encryption features should be included with the obfuscator
Software watermarking is a feature offered by some obfuscator tools to
help track piracy
An obfuscator can improve code efficiency. Look for the obfuscator to
provide Class and method level optimization to improve JIT performance.
The obfuscator should also have Unused Class/Method/Field and constant
pool entry removal. An obfuscator can also provide dynamically-loaded
class (forname) detection
Professional obfuscator models can support efficient Java code
development and deployment. The obfuscator should versions up to 1.5.
An obfuscator should provide Incremental Obfuscation
An obfuscator should provide Automated Stack Trace Translation
An obfuscator should provide Packaging into directories or jars
An obfuscator should support packaging any type of Java - applications,
libraries, applets, servlets, EJBs, etc.
An obfuscator should support fJ2ME CLDC based profiles
An obfuscator should recognize CLDC pre-verified library classes
Obfuscator output should retain 100% pure Java and passes verifiers
Obfuscator control should include command-line interface suitable for
integrating into build environments.
The obfuscator should include a comprehensive User's Guide
The obfuscator should support for Generic Types and Methods
The obfuscator should provide granular configuration.
The DashO java obfuscator
http://www.preemptive.com is a reasonable
choice as they focus on obfuscators