我想创建一个注释,它将是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>