Class c = obj.getClass();
Method m = c.getMethod(name,new Class[]{param1.getClass(),param2.getClass()});
Object result = m.invoke(obj,new Object[]{param1,param2});
If there were some syntactic sugar for dynamic invocation of methods, it would become much shorter and more readable.
Maybe something like this (note the two colons)
obj..name(param1,param2)
As the return value is always untyped (i.e. of type Object) I don't want to cast it down, but rather let the language infer the type and implicitely cast it down (it's unsafe anyway).
Example:
Person p = obj..getPerson();
// instead of
Person p = (Person) obj..getPerson();
What if a method doesn't exist? Usually a MethodNotFoundException would be thrown, but I would like to have a methodNotFound() method defined on java.lang.Object (defaultimpl throws MNE), which is called instead and can be overwritten. The following should illustrate what I mean:
class Stuff {
@Override
protected Object methodNotFound(String name, Object[] params) {
System.out.print(name+",");
return this;
}
public static void main(....) {
new Stuff()..hello()..world()..bla();
// where ..hello() is a shortcut for .."hello"()
}
}
output: hello,world,bla
Of course, this doesn't allow real metaprogramming or similar things, but would make generic code more readable, wouldn't it.
And keep down, these are just some thoughts, I wouldn't add it to Java if I could. Just loud thinking.
BTW.: many features of Ruby or Python everybody loves, like closures or the loose invocation syntax are not restricted to dynamic typing. If you are interested in these things you should definitely have a look at the C#3.0 specs. C#3.0 will have a number of really cool new features! Another language called Scala looks really promising, too.