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语言中直接公开。



