Java bytecode contains information in your Java source files. This byte code is generated by the java compiler as per an explicitly documented specification. It is not impossible to reverse engineer a Java byte code to get at the actual Java code behind it. In fact, there are decompilers that do this to very good degree of precision. This makes intellectual property of your products vulnerable.
An obfuscator changes Java bytecode to make the source code generated by decompilers less useful to a thief. There are two generations of obfuscators:
First generation Java obfuscators primarily perform name obfuscation by change class, field, and method names to meaningless strings. This technique makes the decompiled source hard to understand, but does not obscure the overall flow of the code.
Second generation obfuscators perform flow obfuscation as well as name obfuscation. They do this by making make slight changes to the bytecode that obscure the control flow without changing what the code does at runtime. Typically, selection (e.g.. if…else…) and looping constructs (e.g.. while and for loops) are changed so that they no longer have a direct Java source code equivalent.