I remember I once saw an interesting protection for java implemented by using the launch4j executable wrapper. It embeds the all of the java classes into an executable and references them through pointers. They never get extracted to disk. The author further enhanced the protection by wrapping the exe with a protector. I imagine if you used a strong protector and called some of the protector's functions for crc and date checking from the java code, it would very difficult for someone to make it past the protector to access and/or patch the code.
Launch4J:
Code:
http://launch4j.sourceforge.net/