【问题标题】:applet. java.lang.reflect.InvocationTargetException小程序。 java.lang.reflect.InvocationTargetException
【发布时间】:2011-08-06 23:32:37
【问题描述】:

我有使用 jna 指针类的小程序。小程序代码为:

import com.sun.jna.*;
public class Applet1 extends Applet{
    public void test() {
        try {
            Pointer p = new Memory(73);
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
}

在 html 代码中,我以这种方式声明了 applet:

<applet
    codebase=/pki/
    code=Applet1.class 
    archive=/pki/jna-3.2.3.jar
    id=Applet1
    width=100 
    height=100 >
</applet>

当我通过 javascript 调用 document.getElementById("Applet1").test() 时,会出现 java.lang.reflect.InvocationTargetException。 我不能在 java 类端调用 e.getCause(),因为小程序 try/catch 没有捕获错误(我不明白为什么)。但是 javascript try/catch 捕获了这个错误。 如果移动Pointer p = new Memory(73); 行就可以了。问题是这条线。 请帮忙解决问题。

编辑:如果替换此块:

try {
    Pointer p = new Memory(73);
} catch (Exception e) {
    e.printStackTrace();
}

try {
    Pointer p = new Memory(73);
} catch (Throwable e) {
    System.out.println(e.getCause());
}

我得到 java.security.AccessControlException: access denied (java.util.PropertyPermission jna.boot.library.path read)

【问题讨论】:

  • 尝试catch(Throwable e) 而不是catch(Exception e)。也许你这里有一些错误而不是异常,它将被 JavaScript 桥包裹在你的 InvocationTargetException 中。..
  • @Paŭlo Ebermann:你说得对。它是一个 Throwable 实例。谢谢。现在我弄清楚发生了什么。
  • 实际上,它很可能是某个 Error 子类的实例......(Throwable 是 Error 和 Exception 的超类,几乎从不单独使用。)

标签: java exception applet


【解决方案1】:

好的,现在我们找到问题的根源。 (您仍然可以使用printStackTrace - 这也应该打印出cause 的堆栈跟踪。)。

  1. 未签名的小程序只能访问有限数量的系统属性 - jna 属性不属于这些属性。

  2. 在未签名的小程序中,无论如何您都无法加载本机库,因此无法使用 JNA(或 JNI,顺便说一下)。

  3. 如果您对小程序进行签名(并告诉插件接受签名),则您的小程序拥有使用 JNA 的必要权限。但是任何单个运行代码的权限实际上是调用当前代码的所有方法的权限的交集。

    从 JavaScript 调用的 Applet 方法具有极其有限的权限(因为插件无法真正检查 JavaScript 代码是否具有必要的权限,如果您的浏览器甚至有这样的概念)。

    您可以通过使用AccessController.doPrivileged(...) 包装需要以您的小程序权限运行的代码部分来解决此问题。但首先确保它不会做任何危险的事情(这对于 JNI/JNA 来说很容易),即使是从恶意 JavaScript 代码调用时也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2018-09-15
    相关资源
    最近更新 更多