Java is not Object Oriented
So yesterday I spent the entire day playing with Java's reflection capabilities, which are with out a doubt as developed as a new born babe. The language itself trips over it's own feet, and as such a programmer can not assume basic operations will not throw exceptions.
Take for example, Method.invoke(target, args) which can only be used if you Method.getParameterTypes() iterate over the Class array, and then inspect each argument to see if it matches, or can be substituted for via a proxy, and then maybe you can dispatch. Watch out for java.lang.exception.JavaIsNotObjectOrientedAndBlowsupWhenUsingPolymorphism
because after checking your args not all objects are objects and can recieve thee necessary reflection methods.
Compare Java's reflection to Smalltalk's is like warping back in time to the early 80s and discovering run time reflection to be a novel idea. This of course still doesn't mean Java's Object (which is not the base class of all objects) has no sane way to implement perform:with: or my personal favorite perform:withArgs: which is sort of like what you can hack with invoke but never really works.
Now we could say that Java could not possibly have these features fully baked at it's inception and had to be bolted on much later, but that ignores the simple history of Smalltalk and Sun and the Self language at Sun, and the fact that the Hotspot VM was built based on the Self VM. No it was not that it couldn't, it was because of marketing.
Java makes both painful.