Java no es compatible con el tipado dinámico, pero puede simular algo así mediante el uso de proxy dinámico en Java. En primer lugar tendrá que declarar una interfaz con operaciones que desea invocar en sus objetos:
public interface MyOps {
void foo();
void boo();
}
A continuación, cree proxy para la invocación dinámica sobre myObjectInstance:
MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), //
new Class<?>[] { MyOps.class }, //
new MyHandler(myObject));
p.foo();
p.boo();
donde MyHandler se declara así:
public class MyHandler implements InvocationHandler {
private final Object o;
public MyHandler(Object o) {
this.o = o;
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Method method = o.getClass().getMethod(m.getName(), m.getParameterTypes());
return method.invoke(o, args);
}
}
Por lo tanto, si myObject tiene los métodos foo() y boo(), se invocarán, o bien, obtendrá una RuntimeException.
También hay un número de idiomas que se pueden ejecutar en la compatibilidad con el tipado dinámico de JVM, p. Ej. Scala, Groovy, JRuby, BeanShell, JavaScript/Rhino y muchos otros. Hay algunos cambios de JVM en Java 7 para admitir un despacho dinámico nativo, por lo que estos lenguajes podrían funcionar mucho mejor, pero dicha característica no se expondrá directamente en el lenguaje Java de tipo estático.
Tengo curiosidad por cómo se usa en C#. Parece que lo estás utilizando para escapar de la seguridad de tipo estático, lo cual no es una buena idea ni en C# ** ni ** Java. –