Использование jars, которые используют классы java.beans(Introspector, BeanInfo или PropertyDescriptor)

У меня есть сторонняя банка (которую я не могу изменить), которая использует java.beans.Introspector, java.beans.BeanInfo и java.beans.PropertyDescriptor.

Как я могу использовать эту банку в приложении для Android?

Он не загружает класс (который использует Introspector) из 3-й партийной банки:

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;

Ответ 1

Единственное решение - кошмар для обслуживания: Вилка всех 3-х партийных банок из источника и переписывание их, чтобы они не использовали java.beans. * classes (возможно, заменив их для openbeans).

Затем каждый раз, когда один из этих 3-х партийных банок выпускает исправление (например, для критической ошибки безопасности), делайте это снова и снова.

Ответ 2

Он очищает пакет java.beans не полностью на Android. И общим решением является переупаковка java.beans и jar, зависящая от них, для использования другого имени пакета вместо java.beans. Это именно то, что ранее упоминалось в openbeans. И интересный qoute из сообщения об ошибке android: 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 и попыток заставить сторонних разработчиков использовать их. Из того, что вы пишете, неясно, нельзя ли изменить банку или не разрешено изменять (вы упомянули оба). Я не знаю правовых последствий изменения банок, но технически это всегда возможно, например. попробовав классы обратного инженера, сделайте некоторое время сборки инструмента с чем-то вроде aspectj. Если это не разрешено, я думаю, что можно использовать инструментарий времени исполнения, например. dexmaker может создать прокси для вашего стороннего класса, который использует java.beans, и вы можете переопределить часть этого класса.

Также немного погуглил по теме, я увидел этот. Они просто используют пакет java.beans и компилируют его для Android. Это кажется хрупким для меня, но похоже, что он работает.

К сожалению, это не решение, просто идеи, которые я хотел бы разделить. Надеюсь, вы найдете их полезными.