The main difference is in the required availability of the class. With ClassName.class the class needs to be available at compile time. If the class is missing while you are compiling you will get a compiler error. With Class.forName("ClassName") the class doesn't need to be there at compile time, only at runtime.
Another important difference is the generic type. ClassName.class returns a Class<ClassName>. Class.forName("ClassName") returns a Class<?> - the actual type is not known.
Class.forName actually loads the class. ClassName.class doesn't load the classbecause it's not necessary to do so. If you instantiate the class or access a static member (method, field) then the class is loaded, but not just by calling ClassName.class.