小程序。java.lang.reflect.InvocationTargetException
好的,現在我們來探究問題的根源。(您仍然可以使用printstacktrace-這也應該已經打印的堆棧跟蹤cause。)。
未簽名的小程序只能訪問有限數量的系統屬性-這些jna屬性不屬于這些屬性。
在未簽名的applet中,無論如何您都無法加載本機庫,因此無法使用JNA(或JNI)。
如果您在applet上簽名(并告訴插件接受簽名),則applet具有使用JNA的必要權利。但是,任何單個運行代碼的權利實際上就是稱為當前代碼的所有方法的權利的交叉點。
從JavaScript調用的Applet方法具有非常有限的權限(因為即使您的瀏覽器甚至具有這種概念,插件也無法真正檢查JavaScript代碼是否具有必需的權限)。
您可以通過包裝代碼的一部分來解決此問題,該代碼部分需要在applet的權限下運行AccessController.doPrivileged(...)。但是首先 (對于JNI / JNA來說很容易),即使是從惡意JavaScript代碼中調用也是如此。
解決方法我有使用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(),因為applettry / catch無法捕獲錯誤(我不明白為什么)。但是javascript try / catch捕獲此錯誤。如果移動Pointer p = newMemory(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:訪問被拒絕(已讀取java.util.PropertyPermissionjna.boot.library.path)
相關文章:
1. MySQL 截短某一列的字符串2. 彈出式菜單 - android京東優惠券中心彈出菜單的實現?3. javascript - Angular2中聲明的成員變量為何顯示undefined?4. android - 京東app下面的table背景怎么實現的?5. java - mac下配置ndk環境變量6. javascript - 根據不同數據顯示不同內容7. css - psd設計稿給的是1920寬的,而我的電腦是1600寬的,那我在寫代碼時,是不是每個寬度都要計算調整8. java - new + 類名,一定需要申明一個對象嗎?9. css3 - 如圖的flex骰子布局是怎么實現的?10. 為啥最大化個窗口還得找一堆理由?
