First, realise that you will not be able to stop a determined and capable hacker from bypassing your protection. You can only increase the amount of time it will take, in the hope that they will get fed up before they crack it.
Byte code encryption means the files on your disk don't look like
Java class files and cannot be trivially loaded by some other program. They typically have to be loaded by a custom class loader, which applies some sort of licensing check.
If you use some native code in your scheme, you can make it a bit harder to work out what's going on. I've got one or two further tricks, which I don't think I should pass on.
But still, I don't know of any way to achieve anything beyond deterrent-level protection.