如何在Internet Explorer中从JavaScript创建Java对象?

时间:2012-10-05 14:13:09

标签: java javascript internet-explorer applet internet-explorer-9

让我们首先演示这些步骤的问题:

  1. 打开一些网页,在Internet Explorer 9和真实浏览器(Firefox或Chrome)中加载Java小程序。我们以http://javatester.org/version.html为例。

  2. 在JavaScript控制台中运行此代码:

    j = document.applets[0].Packages;
    image = new j.java.awt.image.BufferedImage(256, 256, 2);
    image.getWidth();
    
  3. 这适用于Firefox和Chrome,它输出的正确图像宽度为256.但Internet Explorer失败,它会在第二行显示此错误消息:

    "java.lang.IllegalArgumentException: No method found matching name java.awt.image.BufferedImage and arguments []" 
    

    知道为什么会失败吗?我能够实例化其他具有默认构造函数的Java类。所以这段代码可以正常工作:

    new j.java.util.Random().nextInt()
    

    那么Internet Explorer或Java插件是否有错误将参数传递给构造函数?错误消息听起来像IE试图在没有任何参数的情况下调用构造函数(并且BufferedImage中没有默认构造函数)。

    我对任何信息(可能是现有的错误报告)感兴趣,这有助于我理解这个问题,修复它或找到解决方法。请注意,这个问题是关于从JavaScript实例化java对象,而不是如何创建图像。所以请不要使用Canvas的答案。

1 个答案:

答案 0 :(得分:1)

您的代码似乎正确无误。不知道为什么IE会失败。

解决方法是在java中创建一个适配器,它执行您正在执行的某些功能。然后从javascript调用此适配器代码。

修改

为了使它更通用,在Java类中使用反射来实例化一个类。我还没有测试过这段代码。

public Object instantiate(String className, Object... params) throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
    Class cls = Class.forName(className);
    List<Class> paramClasses = new ArrayList();
    for (Object p : params) {
        paramClasses.add(p.getClass());
    }
    if (params.length == 0) {
        Constructor constructor = cls.getConstructor();
        return constructor.newInstance();
    }
    else {
        Constructor constructor = cls.getConstructor(paramClasses.toArray(new Class[paramClasses.size()]));
        return constructor.newInstance(params);
    }
}