Java equivalent to C# dynamic class type?

前端 未结 4 1680
[愿得一人]
[愿得一人] 2020-12-06 06:01

I\'m coming from the world of c#.

in C# i am able to use the class dynamic http://msdn.microsoft.com/en-us/library/dd264741.aspx

This allows me to not have t

相关标签:
4条回答
  • 2020-12-06 06:12

    There is nothing like that in Java

    0 讨论(0)
  • 2020-12-06 06:15

    There's nothing equivalent in Java. The closest thing you could do is declare a variable of type Object but then you have to cast that variable to whatever you're expecting in order to invoke any method on it that's not implemented by Object (or use reflection but that's sloooow).

    Java is a strongly typed language. I think for the next version there will be some dynamic typing, to allow for closures, but that's next year or more probably 2012.

    In Groovy you can just use "def" to declare a variable without a type, and the type will be resolved at runtime. And you can compile the Groovy code to Java bytecode...

    0 讨论(0)
  • 2020-12-06 06:18

    You can also include Scala code, which does not require explicit type declarations. Scala produces Java byte code. I haven't used C#, so I'm afraid I can't take this comment to the point of responding directly to the question. Maybe someone else can add to it.

    0 讨论(0)
  • 2020-12-06 06:38

    Java doesn't support dynamic typing, but you can simulate something like that using dynamic proxy in Java. First you'll need to declare an interface with operations you want to invoke on your objects:

    public interface MyOps {
      void foo();
      void boo();
    }
    

    Then create Proxy for dynamic invocation on myObjectInstance:

    MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), //
        new Class<?>[] { MyOps.class }, //
        new MyHandler(myObject));
    p.foo();
    p.boo();
    

    where MyHandler is declared like this:

    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);
      }
    }
    

    so, if myObject has methods foo() and boo(), they will be invoked, or else, you'll get a RuntimeException.

    There is also number of languages that can run in JVM support dynamic typing, e.g. Scala, Groovy, JRuby, BeanShell, JavaScript/Rhino and many others. There is some JVM changes are coming in Java 7 to support a native dynamic dispatch, so these languages could perform much better, but such feature won't be directly exposed in statically typed Java language.

    0 讨论(0)
提交回复
热议问题