gpt4 book ai didi

java - 小程序。 java.lang.reflect.InvocationTargetException异常

转载 作者:搜寻专家 更新时间:2023-11-01 01:56:53 25 4
gpt4 key购买 nike

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

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); 行就可以了。问题是这条线。请帮助解决问题。

编辑:如果替换此 block :

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:访问被拒绝(java.util.PropertyPermission jna.boot.library.path 读取)

最佳答案

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

  1. 未签名的小程序只能访问有限数量的系统属性 - jna 属性不是其中的一部分。

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

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

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

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

关于java - 小程序。 java.lang.reflect.InvocationTargetException异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6955790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com