反射与注解
通过反射机制,程序员可以更加深入地控制程序的运行过程,Annotation注解功能建立于反射的机制之上。
反射
功能:
通过反射可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问,检测,修改描述Java对象本身信息。
包:
java.lang.reflect
getClass()方法:
用于返回一个类型为Class的对象
java">JTextField tf = new JTextField();
Class tf_c = tf.getClass();
访问构造方法:
- getConstructors()。
- getConstructor(Class<?>…parameterTypes)
- getDeclaredConstructors()。
- getDeclaredConstructor(Class<?>…parameterTypes)。
Constructor类的常用方法
方法 | 说明 |
---|---|
isVarArgs() | 查看该构造方法是否允许带有可变数量的参数,如果允许则返回true,否则返回false |
getParameterTypes() | 按照声明顺序以Class数组的形式获得该构造方法的各个参数的类型 |
getExpceptionTypes() | 以 Class数组的形式获得该构造方法可能抛出的异常类型 |
newInstance(Object…initargs) | 通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数则表示采用默认无参数的构造方法 |
setAccessible(boolean flag) | 如果该构造方法的权限为 private,默认为不允许通过反射利用 newInstance(Object…initargs)方法创建对象。那么,先执行该方法,并将入口参数设为true,则允许创建 |
getModifiers() | 获得可以解析出该构造方法所采用修饰符的整数 |
访问成员变量
返回值:
Field类型的对象或数组,每个Field对象代表一个成员变量
- getFields()
- getFields(String name)
- getDeclaredFields()
- getDeclaredFields(String name)
java">object.getFields();
Field类常用方法
方法 | 说明 |
---|---|
getName() | 获得该成员变量的名称 |
getType() | 获得表示该成员变量类型的Class对象 |
set(Object obj,Object value) | 获得指定对象obj 中成员变量的值,返回值为Object型 |
getInt(Object obj) | 获得指定对象obj中类型为int的成员变量的值 |
setInt(Object obj,int i) | 将指定对象obj中类型为int的成员变量的值设置为i |
getFloat(Object obj) | 获得指定对象obj中类型为float的成员变量的值 |
setFloat(Object obj,flaot f) | 将指定对象obj中类型为float的成员变量的值设置为f |
getBoolean(Object obj) | 获得指定对象obj中类型为boolean的成员变量的值 |
setBoolean(Object obj,boolean b) | 将指定对象obj中类型为boolean 的成员变量的值设置为z |
setAccessible(Object flag) | 此方法可以设置是否忽略权限限制直接访问private等私有权限的成员变量 |
getModifiers() | 获得可以解析出该成员变量所采用修饰符的整数 |
访问成员方法
返回值:
Method类型的对象或数组,每个Field对象代表一个成员方法
- getMethods()
- getMethods(String name,Class<?>…parameterTypes)
- getDeclaredMethods()
- getDeclaredMethods(String name,Class<?>…parameterTypes)
Method类的常用方法
方法 | 说明 |
---|---|
getName() | 获得该方法的名称 |
getParameterTypes() | 按照声明顺序以 Class数组的形式获得该方法的各个参数的类型 |
getReturnType() | 以 Class数组的形式获得该方法可能抛出的异常类型 |
getExceptionTypes() | 以 Class数组的形式获得该方法可能抛出的异常类型 |
invoke(Object obj,Object…args) | 利用指定参数args执行指定对象obj中的该方法,返回值为Obiect型 |
isVarArgs() | 查看该方法是否允许带有可变数量的参数,如果允许则返回true,否则返回false |
getModifiers() | 获得可以解析出该方法所采用修饰符的整数 |
Annotation注解功能
用途:
不影响程序运行,作用于编译器警告等辅助工具
定义Annotation类型
定义时需要用到interface关键字,且在关键字前加一个@符号即:@interface
java">public @interface MorememberAnnotation{
String values();
}
String:成员类型,有String,Class,primitive,enumerated,annotation
values:成员名称
为成员设置默认值:
java">public @interface DefaultValueAnnotation{
String describe() default"<默认值>";
Class type() default void.class;
}
定义时使用@Target来设置Annotation类型适用的程序元素种类,若未设置则适用于所有程序元素。
枚举类ElementType中的枚举常量用来设置@Targrt
ElementType中枚举常量:
枚举常量 | 说明 |
---|---|
ANNOTATION_TYPE | 表示用于Annotation类型 |
TYPE | 表示用于类,接口和枚举,以及Annotation类型 |
CONSTRUCTOR | 表示用于构造方法 |
FIELD | 表示用于成员变量和枚举常量 |
METHOD | 表示用于方法 |
PARAMETER | 表示用于参数 |
LOCAL_VARIABLE | 表示用于局部变量 |
PACKAGE | 表示用于包 |
枚举类RetentionPolicy中的枚举常量
枚举常量 | 说明 |
---|---|
SOURCE | 表示不编译Annotation到类文件中,有效范围最小 |
CLASS | 表示编译Annotation到类文件中,但是在运行时不加载Annotation到JVM中 |
RUNTIME | 表示在运行时加载Annotation打JVM中,有效范围最大 |