How can I make it so that if someone extracts the class files from the JAR, he cannot disassemble it
The simple answer is that you can't.
Disassembly (to human readable bytecodes) is trivial. There's even a JDK tool that can do it.
Decompilation to Java code can be partially defeated if you use an obfuscator. An obfuscator can do things to remove useful symbols, and confuse typical decompilers so that they produce uncompilable "code". However, a hacker with moderate skills (and motivation / persistence) can figure out what your code is doing anyway, and hand edit the decompiler output into compilable Java (if that is his / her intent).
The other approach that is sometimes suggested is to encrypt the bytecodes. Unfortunately, that is easier for a hacker for sidestep than obfuscation. At some point your application has to decrypt the bytecode in order that they can be loaded. All the hacker needs to do is intercept them.
And there is no way that you can convince a decompiler / disassembler to tell the user / hacker that he can't decompile / disassemble. It would be a "big fat lie" for a start ...