Java不支持动态类型,但你可以使用Java中的动态代理来模拟类似的东西。首先,您需要声明一个接口,其中包含要在对象上调用的操作:
public interface MyOps {
void foo();
void boo();
}
然后在 myObjectInstance 上为动态调用创建代理:
MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), //
new Class<?>[] { MyOps.class }, //
new MyHandler(myObject));
p.foo();
p.boo();
其中 MyHandler 是这样声明的:
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);
}
}
因此,如果 myObject 有方法 foo() 和 boo(),它们将被调用,否则,你会得到一个 RuntimeException。
还有许多语言可以在JVM中运行,支持动态类型,例如Scala,Groovy,JRuby,BeanShell,JavaScript / Rhino等等。Java 7中出现了一些JVM更改以支持本机动态调度,因此这些语言可以表现得更好,但是这样的功能不会直接在静态类型的Java语言中公开。