簡體   English   中英

使用使用java.beans類的jar(Introspector,BeanInfo或PropertyDescriptor)

[英]Using jars that use java.beans classes (Introspector, BeanInfo or PropertyDescriptor)

我有第三方jar( 我無法改變 ),它使用java.beans.Introspectorjava.beans.BeanInfojava.beans.PropertyDescriptor

如何在我的Android應用程序中使用該jar?

它無法從第3方jar加載類(使用Introspector ):

WARN/dalvikvm(780): VFY: unable to resolve static method 6325: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;)Ljava/beans/BeanInfo;
WARN/dalvikvm(780): VFY: unable to resolve exception class 962 (Ljava/beans/IntrospectionException;)
WARN/dalvikvm(780): Verifier rejected class Lorg/thirdpartyjar/SomeClass;

很明顯java.beans包在android上並不完整。 常見的解決方案是重新打包java.beans和依賴於它們的jar來使用不同的包名而不是java.beans。 這正是之前提到的openbeans所做的。 還有一個來自android錯誤消息的有趣qoute: If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.

為了避免這條路,我將首先研究實際使用openbeans的選項,並試圖強迫第三方使用它們。 根據你的寫作,不清楚jar是不是可以改變或不允許改變(你提到兩者)。 我不知道更換罐子的法律含義,但從技術上講,它總是可行的,例如嘗試逆向工程類,用一些像aspectj這樣的構建時間儀器。 如果不允許這樣做,我認為可以完成運行時檢測,例如dexmaker可以為您的第三方類創建代理,這是使用java.beans並且您可以重新實現此類的一部分。

此外谷歌搜索上我看到的題目有點這個 他們只是使用java.beans包並為android編譯它。 這對我來說似乎很脆弱,但看起來它正在發揮作用。

不幸的是,這不是一個解決方案,只是我想分享的想法。 希望你找到那些有用的。

唯一的解決方案是維護噩夢: 從源代碼中分叉所有第3方jar並重寫它們,這樣它們就不會使用java.beans。*類 (可能將它們替換為openbeans)。

然后,每當第3個聚會罐中的一個發布修補程序(例如關鍵安全錯誤)時,請重新執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM