我想创建一个注释,它将是Target TYPE并声明一个自定义类的对象。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Test {
}

class Student{

}


执行

@Test
class example{
    //Want this annotation to declare something like this
    Student s = new Student();
}

最佳答案

您可以创建CGLIB代理,以扩展用@Test注释的类,并且可以将属性添加到代理。但我认为这不会有任何作用。这是用于入门的示例代码。

首先获取用Test注释的类的列表

    Reflections reflections = new Reflections ("com.demo");
    Set<Class<?>> testClasses = reflections.getTypesAnnotatedWith(Test.class);


然后使用CGLIB创建这些类的代理,并向其添加Student属性。

for (Class<?> test : testClasses) {
    BeanGenerator beanGenerator = new BeanGenerator ();
    beanGenerator.setSuperclass (test);
    beanGenerator.addProperty("student", Student.class);
    Object myBean = (test) beanGenerator.create();
    Method setter = myBean.getClass().getMethod("setStudent", Student.class);
    setter.invoke(myBean, new Student());
}


Maven依赖项:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.4</version>
</dependency>

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

10-06 14:43