I have mixed feelings about Java.<p>Reflection made one tricky part of a project <i>very</i> easy. I still love how elegantly it turned out. The type system is... I used to think it was really good, now I'd just call it "OK". JNI is useful for getting certain things done, but the syntax is gouge-your-eyeballs-out awful. Checked exceptions are very useful if you are serious about error handling, and a royal pain if/when you are not.<p>But the thing that was great about Java, to me, was the library. It was like Barbie - it had <i>everything</i>. I'm just talking about the standard Java library here.<p>Then you get into the other libraries - Spring and J2EE frameworks and Hibernate and so on, and the XML configuration files multiply. They do great things, but if you have to change what they do, you have to change some setting in some XML file, which uses some syntax that you don't know, and your job is to figure out which XML file and which setting and where the documentation is, and you just go insane. I understand why people loathe that environment.