I know this must be very well discussed topic on Internet but I could not come to any conclusion after referring them.
Many people do suggest obfuscator but they just do rename classes / methods / fields with tough to remember character sequences but what about sensitive constant values ?
For example, you have developed the encryption / decryption component based on Password Based encryption technique. Now in this case any average Java person can use JAD (http://www.kpdus.com/jad.html) to decompile the class file and easily retrieve the password value (defined as constant) as well as SALT and in turn can decrypt the data by writing small independent program !
Or you suggest to build such sensitive components in Native code (e.g. VC++) and call them via JNI.