According to a July 30, 2004 article in InformIT by Alex Kalinovsky:
Obfuscation is the process of transforming bytecode to a less human-readable form with the purpose of complicating reverse engineering. [For Java code,] it typically includes stripping out all the debug information, such as variable tables and line numbers, and renaming packages, classes, and methods to machine-generated names. Advanced obfuscators go further and change the control flow by restructuring the existing logic and inserting bogus code that will not execute. The premise of the obfuscation is that the transformations do not break the validity of the bytecode and do not alter the exposed functionality.However, even for flow-obfuscated code, it may still be possible to reverse engineer the application implementation using a good old-fashioned debugger.