自定义注解注入属性值(基于类构造方法)

本文将举例说明如何通过构造方法来处理注解,实现属性注入

  1. 自定义注解Name
  2. 实现超类,定义注解处理方法
  3. 子类使用注解

自定义注解Name

定义一个注解“Name”,Name注解可以接收一个String类型的属性,并且可以使用在类或者属性上

1
2
3
4
5
6
7
8
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Name {

String value() default "";
}

超类实现

实现一个超类Person,并在Person的构造方法中使用Java反射机制注入属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public abstract class Person {

public Person() {
setName(this.getClass());
}

public void setName(Class clazz) {
//处理注解在类上
if (clazz.isAnnotationPresent(Name.class)) {
Name annotation = (Name) clazz.getAnnotation(Name.class);
try {
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(this, annotation.value());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return;
}
//处理注解在属性上
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
Name annotation = declaredField.getAnnotation(Name.class);
if (null == annotation) {
continue;
}
declaredField.setAccessible(true);
try {
declaredField.set(this, annotation.value());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}

子类使用自定义注解

定义类Xiaolv,并继承Person,Xiaolv类用@Name注解修饰(为name属性注入值为“小绿”)

1
2
3
4
5
6
7
8
9
@Name("小绿")
public class Xiaolv extends Person{

private String name;

public void sayHi() {
System.out.println("hello, my name is " + name);
}
}

测试一下

如下例子会打印出:
hello, my name is 小绿

1
2
3
4
5
6
7
8
9
10
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloTest {

@Test
public void HelloXiaolvTest() {
Xiaolv xiaolv = new Xiaolv();
xiaolv.sayHi();
}
}

子类属性使用自定义注解

定义类Xiaolan,并继承Person,Xiaolan类的属性name用@Name注解修饰(为name属性注入值为“小绿”)

1
2
3
4
5
6
7
8
9
public class Xiaolan extends Person{

@Name("小蓝")
private String name;

public void sayHi() {
System.out.println("hello, my name is " + name);
}
}

测试一下

如下例子会打印出:
hello, my name is 小蓝

1
2
3
4
5
6
7
8
9
10
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloTest {

@Test
public void HelloXiaolanTest() {
Xiaolan xiaolan = new Xiaolan();
xiaolan.sayHi();
}
}

总结

本文举例说明了一种处理自定义注解的方式,通过类构造器在对象创建后注入属性。

在实际开发中,处理注解还有其他多种方式,各有优缺点。

例如: