反射中一个重要的类:Field
Field简介:
Field是位于Java.lang.reflect包下的一个类
Java中我们可使用反射获取Field对象
获取Field类对象的方法
获取Field类对象的方法
Class.getDeclaredField(String name); | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员) |
Class.getDeclaredFields(); | 返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员) |
Class.getField(String name); | 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 |
Class.getField(String name); |
元注解:@Retention
注解@Retention用来修饰注解,是注解的注解。称为元注解。
Retention注解有一个属性value,是RetentionPolicy枚举类型,决定了Retention注解应该如何去保持。
RetentionPolicy有三个值:SOURSE,CLASS ,RUNTIME。
-
注解只会保留在源文件中,编译时注解会被遗弃。
-
注解会保留到class文件中,当class文件中被加载时遗弃,这是默认的注解生命周期。
-
注解不仅被保留到class文件中,还会保留到虚拟机运行时一直存在。
对应于:源文件,.class文件,内存中的字节码。
使用场景:
如果需要在运行时反射去获取注解信息,那只能用RUNTIME注解。
如果编译时需要依赖注解进行预处理,比如生成一些辅助代码等,如Butterknihe,Arounter就用CLASS注解。
如果只是做一些检查性操作,比如@Override和@SuppressWarnings,使用
SOURSE注解,一般是供IDE使用。
手写一个注解类
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface godvPro {
String columnName() default "fzw";
}
注解与反射的简单使用
import java.io.File;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
public class TestReflect {
@godvPro
public String money;
public static void main(String[] args) {
Field[] fields = TestReflect.class.getDeclaredFields();
List<Field> fields1 = Arrays.asList(fields);
fields1.forEach(x -> System.out.println(x.getAnnotation(godvPro.class).columnName()));
}
}