However there is a Java bytecode goto instruction, so Java bytecodes can represent non-reducible control flow graphs. Control flow abstraction is essentially the inverse of the task that a compiler performs. The loops both terminate when i equals 1000. The task of making reverse engineering difficult is not easy. Client-server models of protection, while providing the best security, suffer from limitations on the network.
Encryption requires the use of specialised hardware, which limits the portability of programs.
Using native object codes makes reverse engineering harder but increases the software support effort. Also, digital signatures are required to prevent tampering. Code obfuscation, while not providing absolute security, is portable, does not require specialised hardware and is transparent to the Java bytecode verifier. However, it does impose an execution time-space penalty on the program being protected. Code obfuscation is a fruitful area for further research.