注解的分类
- 只有一个属性的注解
例如下面的Parameter注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
public @interface Parameter {
String value() default "";
}
使用注解
public class Test {
@Parameter("testName")
private String username;
}
在运行时进行反射的类编写
//target表示运行的类
public static void initParamemterAnnotation(Object target){
Class clz = target.getClass();
Field[] fieldsList = clz.getFields();
for(Field field:fieldsList){
if (field.getAnnotation(Parameter.class) != null) {
Parameter parameter = field.getAnnotation(Parameter.class);
field.setAccessible(true);
}
}
try {
v = parameter.value();
field.set(target, v);
} catch (IllegalAccessException e) {
throw new RuntimeException(
}
2.有多个属性的注解(一个对象的注解)
例如下面的Account注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
public @interface Account {
String account() default "";
String password() default "";
String userName() default "";
String uid() default "";
}
需要有一个注解对应的类AccountInfoDo
public class AccountInfoDo {
public String account;
public String userName;
public String password;
public String uid;
@Override
public String toString() {
return "AccountInfoDo{" +
"account='" + account + '\'' +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", uid='" + uid + '\'' +
'}';
}
}
使用注解
public class Test {
@Account(account = "AC_54833236_12", userName = "霍雅", password = "123456a!", uid = "144112762")
public static AccountInfoDo MainAccount = new AccountInfoDo();
}
在运行时进行反射的类编写
public static void initAccountAnnotation(Object target){
Class clz = target.getClass();
//Field[] fields = clz.getFields();
//获取运行的类和父类中属性 都检查是否有Account注解 最后写这个方法
List<Field> fields = getAllFields(clz);
for (Field field : fields) {
if(field.getAnnotation(Account.class) != null) {
Account account = field.getAnnotation(Account.class);
field.setAccessible(true);
List<Field> accountFields = getAllFields(AccountInfoDo.class);
for (Field property : accountFields) {
value = Acconut.class.getMethod(property.getName()).invoke(account);
}
try{
property.set(field.get(target), value);
}catche(Exception ex) {
System.out.println("initAccountAnnotation failed!");
}
}
3.getAllFields方法
private static List<Field> getAllFields(Class<?> clazz) {
// 获取父类中的参数
List<Field> allFields = new ArrayList<>();
Class<?> classType = clazz;
while (!Object.class.equals(classType) && classType != null) {
Field[] fields = classType.getDeclaredFields();
for (Field f : fields) {
allFields.add(f);
}
classType = classType.getSuperclass();
}
return allFields;
}