让我们首先演示这些步骤的问题:
打开一些网页,在Internet Explorer 9和真实浏览器(Firefox或Chrome)中加载Java小程序。我们以http://javatester.org/version.html为例。
在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的答案。
答案 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);
}
}