反射和注解
一.反射
反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
Java反射框架主要提供以下功能: 参考知乎
- 1.在运行时判断任意一个对象所属的类;
- 2.在运行时构造任意一个类的对象;
- 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
- 4.在运行时调用任意一个对象的方法
(一)、得到构造器的方法-Constructor
onstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
(二).获得字段信息的方法-Field
Field getField(String name) -- 获得命名的公共字段
Field[] getFields() -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields() -- 获得类声明的所有字段
(三).获得方法信息的方法-Method
Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
Method[] getMethods() -- 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods() -- 获得类声明的所有方法
(四).获取Class(类类型)的三种方式
1.根据类的对象获取
Person person = new Person ( );
Class clazz = person.getClass ( );
2.根据类获取
Class clazz = Person.class;
3.通过类名获取
Class clazz = Class.forName("com.lanou3g.code0510.reflection.Person")
(五).通过反射调用方法的代码:
Person person = new Person ( );//创建person类的对象
person.setName("张三");//设置属性值
person.setAge(19);//设置属性值
Class clazz = Person.Class;//创建Class对象
//通过类的方法名获得该方法
Method showMethod = clazz.getDeclaredMethod ("show");
showMethod.setAccessible (true);//让这个类的方法可以被访问
showMethod.invoke(Person);//调用这个方法
二.注解
它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。
1.基本格式:public @interface 注解名 {定义体}
2.四个元注解,用于修饰注解的注解
1).@Target:表示该注解可以用于什么地方。
取值(ElementType)包括:
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
2).@Retention:表示需要在什么级别保存该注解信息。
取值(RetentionPolicy)包括:
SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留)
RUNTIME:在运行时有效(即运行时保留),因此可以通过反射机制读取注解的信息。
3).@Documented:表示将此注解包含在javadoc中。
4).@Inherited:表示允许子类继承父类中的注解。