Class类与Java反射
一、反射概述
-
通过Java反射机制,可以访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能
-
java.lang.refliect包提供了该功能的支持
-
通过反射可访问的主要描述信息
二、访问构造方法
-
如果要访问指定的构造方法,则需要根据该方法的入口参数的类型来访问;Constructor类的常用方法:
-
Modifier类的常用解析方法
方法 功能描述 isPublic(int mod) 查看是否被public修饰符修饰,如果是返回true,否则返回false isProtected(int mod) 查看是否被protected修饰符修饰,如果是返回true,否则返回false isPrivate(int mod) 查看是否被private修饰符修饰,如果是返回true,否则返回false isStatic(int mod) 查看是否被static修饰符修饰,如果是返回true,否则返回false isFinal(int mod) 查看是否被finall修饰符修饰,如果是返回true,否则返回false toString(int mod) 以字符串形式返回所有修饰符 -
实例,判断对象constructor对象是否被private修饰,以及以字符串形式获得该构造方法的所有修饰符;
int modifiers = constructor.getModifier(); //用getModifier方法解析constructor对象并将结果赋给modifier boolean isEmbellishByPrivate = Modifier.isPrivate(modifiers); //判断构造方法是否被private修饰,并将结果赋给 //isEmbellishByPrivate String embellishment = Modifier.toString(modifiers); //返回所有修饰符,并将结果赋给embellishment
三、访问成员变量
-
利用Field对象可以操纵相应的成员变量
-
Filed类常用方法
四、访问方法
-
利用Method对象可以操纵相应的方法
-
Method类的常用方法
五、定义Annotation(标注/注释)类型
-
Annotation功能可以用于类、构造方法、成员变量、方法、参数等的声明中
-
定义Annotation类型的关键字为@interface,继承java.lang.annotation.Annotation接口
-
public @interface NoMemberAnnotation{ } //未包含成员变量 public @interface OneMemberAnnotation{ String value(); } //定义了一个成员变量 public @interface MoreMemberAnnotation{ String describe(); Class type(); } //定义了多个成员 public @interface DefaultMemberAnnotation{ String describe() default"<默认值>"; Class type() default void.class; } //为成员定义了默认值 /*成员类型:String / primitive /enumerated/annotation ,以及所列类型的数组 成员名称:只有一个成员时通常将其设为value*/
-
通过@Target来设置Annotation类型适用的程序元素种类,如未设置则表示适用于所有程序元素;枚举类ElementType中的枚举常量来设置@Target
-
通过@Retention可以设置Annotation的有效范围;用枚举类RetentionPolicy中的枚举常量来设置@Retention,如未设置,则Annotation的有效范围为CLASS表示的范围
-
六、访问Annotation信息
-
如果在定义Annotation时将@Retention设置为RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到相关的Annotation信息,如构造方法、字段、方法的Annotation信息。
方法 功能描述 isAnnotationPresent(Class<?extends Annotstion> annotationClass) 查看是否添加了指定类型的Annotation,若是则返回true,否则返回false getAnnotation(Class annotationClass) 获得指定类型的Annotation,若存在则返回相应对象;否则返回null getAnnotations() 获得所有的Annotation,返回一个Annotation数组 getParameterAnnotations() 获得为所有参数添加的Annotation,将以Annotation类型的二维数组返回;在数组中的顺序和声明时的顺序相同,若没有参数,则返回一个长度为0的数组;若存在未添加Annotation的参数,则用一个长度为0的嵌套数组占位