2011-09-04 30 views
6

我们有一个我们打算跨项目使用的Java代码库。其中一些项目需要在该库中的Java对象中添加注释(即,在一个项目中,这些对象将用于JAX-RS servlet实现中,因此需要使用JAXB,JSON等注释来注释它们)。我遇到的问题是我无法弄清楚如何在不更改原始库的情况下添加这些注释。在java项目中添加/修改注释

考虑这个例子:

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

在一些项目中,我想这个类的行为,如果它是

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

起初,我想过使用的接口或单独标注的派生类但无法弄清楚如何去做(或者是否可能)。我还发现了关于Javassist的建议in this thread(即Java字节码操作方法),但问题是这需要在Android客户端上运行,所以它不适合我。在这一点上,我没有想法。

如果有人能够以任何方式提供帮助,我将不胜感激。也许我错过了一些东西,或者我想要做的不是正确的方式。无论如何,我现在需要一些指导以便继续。

非常感谢。

+0

更改原始库的问题是什么?这是你的代码,据我所知。 – CommonsWare

+0

该库管理一堆对象,它们的集合和内存中的CRUD功能(约束,验证等)。它没有任何有关这些对象的序列化和持久性的知识,并且我想将它们分开。此外,不可用的批注可能会在目标平台上导致问题:Android没有JAXB批注,即使未使用JAXB批注(NoClassDefFoundError),任何处理批注的框架都会在Android上失败。我想避免添加注释,如果它们不会被目标平台使用。 – alokoko

回答

4

我看着这个越来越作为一个总结,这里是我的发现:

主要由于JAXB没有出现在Android上(以及其他原因),我们切换到JSON并开始使用Jackson作为实现。这种变化的一个好处是能够使用杰克逊所谓的“混合注释”,这正是我所期待的。

下面是更详细地解释它的链接:http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0

在运行时不能破解.class字节码,这是无法完成的。如果您真的想在运行时动态更改库类的字节码,那么可以使用Javassist,但在更大的情况下,这可能最终会导致严重错误。

我建议你只注释库并重新编译它的代码库。如果不是,您仍然可以通过继承将库类/接口包装到您自己的类/接口中,并在那里进行注释。无论哪种方式,我认为在代码中注释比通过运行时字节码黑客更好。额外的奖励,源代码中的注释将被IDE看到,从而让IDE更好地为您提供帮助。

+0

看到我对这个问题的评论。我已经知道Javassist,但我需要它在Android平台上工作,Javassist不能在Android上工作。 – alokoko