Добавление / изменение аннотаций в Java-проекте - PullRequest
6 голосов
/ 04 сентября 2011

У нас есть библиотека кода Java, которую мы намерены использовать в разных проектах. Некоторые из этих проектов потребуют добавления аннотаций к объектам Java в этой библиотеке (т.е. в одном проекте эти объекты будут использоваться в реализации сервлета JAX-RS, поэтому их необходимо аннотировать с помощью аннотаций JAXB, JSON и т. Д.). У меня проблема в том, что я не мог понять, как добавить эти аннотации без изменения исходной библиотеки.

Рассмотрим этот пример:

public class MyClass
{
    private String field1;
    private int field2;
}

В некоторых проектах я хотел бы, чтобы класс вел себя так, как если бы он был

public class MyClass
{
    @Annotation1
    private String field1;
    @Annotation2
    private int field2;
}

Изначально я думал об использовании интерфейсов или производных классов, которые отдельно аннотированы, но не могли понять, как это сделать (или возможно это или нет). Я также узнал о предложении Javassist в этой теме (т. Е. Подход манипуляции с байт-кодом Java), но проблема в том, что это должно работать и на клиентах Android, поэтому это не вариант для меня. На данный момент у меня нет идей.

Буду признателен, если кто-нибудь сможет помочь. Может быть, я что-то упускаю, или, может быть, то, что я пытаюсь сделать, - это не правильный путь. В любом случае, чтобы продолжить, мне нужно какое-то руководство.

Заранее большое спасибо.

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Я посмотрел на это больше и в качестве резюме вот что я нашел:

  • Язык Java не позволяет изменять аннотации во время выполнения.
  • Можно использовать Javassist для изменения байт-кода Java, но он не работает на платформах, таких как Android.
  • Можно использовать ASM , но это связано с работой со сборкой Java (пример здесь: http://community.jboss.org/thread/150002).

В первую очередь из-за отсутствия JAXB на Android (и по другим причинам) мы перешли на JSON и начали использовать Джексона в качестве реализации. Одним из преимуществ этого изменения была возможность использовать то, что Джексон называет «смешанными аннотациями», и это именно то, что я искал.

Вот ссылка, объясняющая это подробнее: http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0 голосов
/ 04 сентября 2011

За исключением взлома байт-кода .class во время выполнения, это не может быть сделано.Вы можете использовать Javassist, если вы действительно хотите динамически изменять байт-код библиотечных классов во время выполнения, но на более широком рисунке это, вероятно, закончится ужасным взрывом.

Я бы предложил просто аннотировать библиотеку и перекомпилироватьесли это ваша кодовая база.Если это не так, вы все равно можете обернуть библиотечные классы / интерфейсы в свои собственные классы / интерфейсы через наследование и комментировать там.В любом случае, я думаю, что было бы лучше комментировать в коде, чем путем взлома байт-кода во время выполнения.Добавленный бонус, аннотации в источнике будут видны IDE, что позволит IDE лучше вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...