创建Java注释包装器

创建Java注释包装器,java,annotations,wrapper,Java,Annotations,Wrapper,我目前正在使用一个由第三方库提供的注释,我想知道是否有办法在它周围创建另一个“包装器注释”,这样我就不需要所有参数 例如,我可以使用如下库注释: @LibraryAnnotation(Parameter1, Parameter2, Parameter3) @Test @SqlGroup( { @Sql( executionPhase = BEFORE_TEST_METHOD, config = @SqlConfig(tra

我目前正在使用一个由第三方库提供的注释,我想知道是否有办法在它周围创建另一个“包装器注释”,这样我就不需要所有参数

例如,我可以使用如下库注释:

@LibraryAnnotation(Parameter1, Parameter2, Parameter3)
@Test
@SqlGroup(
    {
        @Sql(
            executionPhase = BEFORE_TEST_METHOD,
            config = @SqlConfig(transactionMode = ISOLATED),
            scripts = {"classpath:test/sqls/_truncate_tables.sql"}
        ),
        @Sql(
            executionPhase = AFTER_TEST_METHOD,
            config = @SqlConfig(transactionMode = ISOLATED),
            scripts = {"classpath:test/sqls/_truncate_tables.sql"}
        )
    }
)
public void countTeams_countOnEmptyTable_returnsWithEmptyList() {}
但是在我的例子中,Parameter2和Parameter3总是相同的,所以我想创建一个只接受Parameter1的注释

@MyAnnotation(Parameter1)

但是将使用所有参数调用另一个注释,类似于为第三方方法创建包装的方式。

注释非常有限。不幸的是,我看不出有什么办法,但我可能是错的。

据我所知,目前有两种方法可以实现这一点:

  • 使用Daileon工具()——因为它更像是一个实验性工具,所以它的可用性有点麻烦
  • 使用面向方面的编程和类型间声明注入新注释,例如:

    declare@type:@MyAnnotation包。*:@LibraryAnnotation(..)


但是,这两个选项都有很大的局限性。

您可以使用基本注释对注释进行注释,如本示例所示:

@Target(value = {ElementType.TYPE})
@Page(method3="someValue")
public @interface Move {
 String method1();
 String method2();
}

@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface Page{
 String method3();
}

我最初的测试是这样的:

@LibraryAnnotation(Parameter1, Parameter2, Parameter3)
@Test
@SqlGroup(
    {
        @Sql(
            executionPhase = BEFORE_TEST_METHOD,
            config = @SqlConfig(transactionMode = ISOLATED),
            scripts = {"classpath:test/sqls/_truncate_tables.sql"}
        ),
        @Sql(
            executionPhase = AFTER_TEST_METHOD,
            config = @SqlConfig(transactionMode = ISOLATED),
            scripts = {"classpath:test/sqls/_truncate_tables.sql"}
        )
    }
)
public void countTeams_countOnEmptyTable_returnsWithEmptyList() {}
通过这个基本注释,我清理了测试文件:

 @Target({ElementType.TYPE, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Inherited
 @SqlGroup(
        {
            @Sql(
                executionPhase = BEFORE_TEST_METHOD,
                config = @SqlConfig(transactionMode = ISOLATED),
                scripts = {"classpath:test/sqls/_truncate_tables.sql"}
            ),
            @Sql(
                executionPhase = AFTER_TEST_METHOD,
                config = @SqlConfig(transactionMode = ISOLATED),
                scripts = {"classpath:test/sqls/_truncate_tables.sql"}
            )
        }
)
最后我得到了这个干净的版本:

@Test
@BaseSqlGroup
public void countTeams_countOnEmptyTable_returnsWithEmptyList(){}

把你的答案记下来,因为我还没有找到答案。我认为这是不可能的。@user1751547为什么会被否决?这就是方法…请解释更多。在您的示例中,@Page注释是@LibraryAnnotation吗?仅当@LibraryAnnotation具有
@Target(value={ElementType.ANNOTATION\u TYPE})
时,此功能才/始终有效吗?