我安装了java7,其他都OK,就是无法使用java.dyn这个包
有没有大侠用过啊,告诉下
我查了相关的资料,说是java7的特性,但是我的为啥不能用呢?
希望知道的告诉我,没接触过的路过吧,谢谢!

解决方案 »

  1.   

    是不是用的JDK不是最新的,是什么情况啊
      

  2.   

    你有導入這個包嗎?eclipse要3.6以後的版本(反正就是最新版)才支持jdk7,
      

  3.   

    java.dyn 是草案时的包名。MethodHandle 现在在 java.lang.invoke包
      

  4.   

    果然! 正如你所说,实际上我是想知道下invokedynamic的真面目,我参看了文档,并依其所述写了一个小测试程序,但反编译后并没有发现invokedynamic的调用,类似如上的实现做了几天都无功而返,以下我贴出我的程序,望请指点,赐教
    程序清单包括两个类:
    1.IntegerOps.java
    public class IntegerOps {
    public static Integer adder(Integer x, Integer y) {
    return x + y;
    }
    }2.Test.java
    import java.lang.*;
    import java.util.*;
    import javax.script.*;
    import java.lang.invoke.*;public class Test {
    public static CallSite mybsm(MethodHandles.Lookup callerClass, String dynMethodName, MethodType dynMethodType) throws Throwable {
      MethodHandle mh = callerClass.findStatic(
      Test.class, 
      "IntegerOps.adder",
      MethodType.methodType(Integer.class, Integer.class, Integer.class));
      if (!dynMethodType.equals(mh.type())) {
      mh = mh.asType(dynMethodType);
      }
      
      return new ConstantCallSite(mh);
    }

    private static void js(ScriptEngine jsEngine) throws ScriptException {
    Double dVar = (Double)jsEngine.eval(
            "a = 1 + 2;"
        );
    System.out.println(dVar);
    }

    public static void main(String[] args) throws ScriptException, NoSuchMethodException {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine se = sem.getEngineByName("JavaScript");
    if(se == null) {
            System.err.println("No script engine found for JavaScript");
            System.exit(1);
    }
    js(se);
    }
    }
    我调试的结果是在运行时,Bootstrap方法mybsm并没有被调用,另外我也曾将IntegerOps.adder的参数和返回值改成了Double...,但仍然是无功而返,请帮忙看看啊!
      

  5.   

    jdk自带的js实现没有使用invokedynamic。Oracle正在实现一个使用invokedynamic的js。你可以看这个 A compiler that takes a Dart file and generate a jar file that can run on any Java 7 compatible VM.
      

  6.   

    不错,我看了
    我用mozilla的rhino引擎重写了刚才的程序,反编译的结果如前
    浏览了一些资料,得出如下的结论,依照JSR 292在JAVA SE7确实添加了invokedynamic,但是ORACLE编译器还不支持,但是JVM支持.
    推出这个指令目前就只能供一些JAVA工具的开发者使用,比如开发兼容的JAVA7编译器,不知道我的理解对不?
      

  7.   

    asm 库已经支持 invokedyn了。
      

  8.   

    ASM应该就是个BCI的东东,还算不上编译器吧!或者说它只是提供了一个instrument的接口,可以注入byte code的,里边有注入invokedynamic的机制
      

  9.   

    一些jvm上的语言使用asm生成字节码。