2

让我们从通过这些步骤演示问题开始:

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

这适用于 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 的问题。

4

1 回答 1

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);
    }
}
于 2012-10-05T15:02:31.153 回答