一、注解
声明一个注解使用 @interface 关键字;
public @interface Test{String value(); //无默认值 int age() default 1; //有默认值}
1、元注解
对注解类进行注解的注解我们称之为元注解;常用的元注解有四个;
@Target
标记另一个注解类,声明该注解可以作用的范围;ElementType.ANNOTATION_TYPE 可以应用于注解类型。ElementType.CONSTRUCTOR 可以应用于构造函数。ElementType.FIELD 可以应用于字段或属性。ElementType.LOCAL_VARIABLE 可以应用于局部变量。ElementType.METHOD 可以应用于方法级注解。ElementType.PACKAGE 可以应用于包声明。ElementType.PARAMETER 可以应用于方法的参数。ElementType.TYPE 可以应用于类的任何元素。
@Retention
标记另一个注解类,声明该注解的保留策略;RetentionPolicy.SOURCE - 标记的注解仅保留在源级别中,并被编译器忽略。RetentionPolicy.CLASS - 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。RetentionPolicy.RUNTIME - 标记的注解由 JVM 保留,因此运行时环境可以使用它。
@Documented
标记另一个注解类,声明该注解用于被 javadoc 工具提取成文档;
@Inherited
标记另一个注解类,表示允许子类继承父类中定义的注解;
2、注解应用场景
RetentionPolicy.SOURCE 源码级别的注解:提供给 IDE 语法检查、APT 等场景使用; RetentionPolicy.CLASS class 级别的注解:字节码操作,直接修改 class 字节码文件; RetentionPolicy.RUNTIME 运行级别的注解:结合反射技术获取注解中的所有信息;
二、反射
反射是 Java 被视为动态语言的关键;
反射是指在运行过程中,对于任何一个类,都能够知道这个类所有属性和方法,都能创建该类的对象;对于任意一个对象,都能够调用它的任意方法,能够设置它的任意属性;
反射始于 Class,Class 是一个类,封装了当前对象所对应的类的信息;一个类中有方法,属性,构造方法等,现在需要一个类,用来描述类,这就是 Class,他应该有类名、属性、方法和构造器等;Class 是用来描述类的类;
Class 类是一个对象照镜子的结果,对象可以看到自己有哪些属性、方法、构造器,继承了那些类、实现了哪些接口等等;对于每个类,JRE 都为其保留一个不变的 Class 类型的对象,一个 Class 对象包含了特定某个类的有关信息;一个类在 JVM 中只会有一个 Class 实例;
1、获取 Class 对象的三种方式
-
通过类名获取 类名.class
-
通过对象获取 对象名.getClass()
-
通过全类名获取 Class.forName(全类名)
2、判断对象类型及 Class 对象类型
我们可以使用 instanceof 关键字判断一个对象是否是某个类的实例;
在 Class 类中也有两个方法用于类似的判断; public native boolean isInstance(Object var)方法用于判断一个对象是否属于某个类; public native boolean isAssignableFrom(Class<?> var)方法用于判断两个 Class 对象是否表示的同一个 Class;
3、创建实例
通过反射生成对象主要有两种方式: 方法一:通过 Class 对象的 newInstance 方法构造对应类的对象; 方法二:通过 Class 对象的 getConstructor 方法获得 Constructor 对象,再调用 Constructor 对象的 newInstance 方法构造对象,这种方法可以用指定的构造器创建对象;
4、获取构造器对象的方法
Constructor getConstructor(Class[] params) 获得使用特殊的参数类型的 public 构造函数(包括父类)
Constructor[] getConstructors() 获得类的所有公共构造函数 (包括父类)
Constructor getDeclar Java 开源项目【ali1024.coding.net/public/P7/Java/git】 edConstructor(Class[] params) 获得使用特定参数类型的构造函数(包括私有)
Constructor[] getDeclaredConstructors() 获得类的所有构造函数(包括私有)
Constructor 对象 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 的 newInstance 方法用于获取类的实例对象;
5、获取类的成员变量(字段)的方法
Field getField(String name) -- 获得命名的公共字段(包括父类)Field[] getFields() -- 获得类的所有公共字段(包括父类)Field getDeclaredField(String name) -- 获得类声明的命名的字段(包括私有)Field[] getDeclaredFields() -- 获得类声明的所有字段(包括私有)Field 对象的 set 和 get 方法用于获取和设置属性值;
6、获取类的方法
Method getMethod(String name, Class[] params) 使用特定的参数类型,获得命名的公共方法(包括父类)Method[] getMethods() 获得类的所有公共方法 (包括父类)Method getDeclaredMethod(String name, Class[] params)使用特写的参数类型,获得类声明的命名的方法(包括私有)
小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。
原文出处:xie.infoq.cn/article/413a8c4192baa81d376878a9d