小程序。java.lang.reflect.InvocationTargetException

小程序。java.lang.reflect.InvocationTargetException,java,exception,applet,Java,Exception,Applet,我有一个使用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代码

我有一个使用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
    codebase=/pki/
    code=Applet1.class 
    archive=/pki/jna-3.2.3.jar
    id=Applet1
    width=100 
    height=100 >
</applet>


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

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

  • 未签名的小程序只能访问有限数量的系统属性,
    jna
    属性不是这些属性的一部分

  • 在未签名的小程序中,无论如何都无法加载本机库,因此无法使用JNA(顺便说一下,也不能使用JNI)

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

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

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


  • 尝试
    catch(Throwable e)
    而不是
    catch(Exception e)
    。也许您在这里有一些错误,而不是异常,它将通过JavaScript桥包装在您的InvocationTargetException中。@Paŭlo Ebermann:您是正确的。这是一个可以扔掉的例子。谢谢现在我知道发生了什么。实际上,它很可能是某个错误子类的实例。。。(Throwable是Error和Exception的超类,几乎从未单独使用过。)
    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());
    }