一、反射
1.1 反射是什么
Java的反射(reflection)机制是运行时获取类的信息(构造函数、属性、方法、注解)。
1.2 反射的作用
1.创建类的对象
2.获取类中的属性,并设置属性的值或者获取属性的值
3.获取类中的方法,可以执行方法(包含私有)
4.获取注解信息
1.3 反射的应用
1.创建类的对象,比如JSON解析,框架中的某些类等
2.获取或设置属性的内容 Field 比如 JSON解析,JDBC封装等
3.执行方法,可以调用Method invoke 代理模式
1.4 反射的演示
全限定类名:类的全称,包含:包名.类名
代码语言:javascript复制public static void main(String[] args) {
//反射 Class 字节码 创建Class对象
//Class对象的三种创建方式 1.类名.class 2.对象名.getClass() 3.Class.forName("全限定类名")
//1.创建Class对象
Class clz=Teacher.class;
//2.获取类中的公共属性
Field[] fields1=clz.getFields();//获取类中公共访问修饰符的属性,包含继承
for(Field f:fields1){
System.out.println(f.getName());
}
System.out.println("---------");
//3.获取类中的所有属性,不包含继承的
Field[] fields2=clz.getDeclaredFields();//获取类中的所有属性,不包含父类中的
for(Field f:fields2){
System.out.println(f.getName());
}
System.out.println("---------");
//4.获取公共方法
Method[] methods1=clz.getMethods();//获取类中公共访问修饰符的方法,包含继承
for(Method m:methods1){
System.out.println(m.getName());
}
System.out.println("**********");
//5.获取所有方法,不包含父类的
Method[] methods2=clz.getDeclaredMethods();//获取类中的所有方法,不包含父类中的
for(Method m:methods2){
System.out.println(m.getName());
}
}
1.5 反射总结
1.Class对象创建方式
●类名.class
●对象名.getClass()
●Class.forName("全称类名")
2.Class中常用的方法
返回值 | 方法名 | 作用 |
---|---|---|
Field[] | getFields | 获取类中公共访问修饰符的属性,包含继承 |
Field[] | getDeclaredFields | 获取类中的所有属性,不包含父类中的 |
Field | getDeclaredField(属性名) | 获取类中的指定的属性 |
Method[] | getMethods | 获取类中公共访问修饰符的方法,包含继承 |
Method[] | getDeclaredMethods | 获取类中的所有方法,不包含父类中的 |
Method | getDeclaredField | 获取类中的指定的方法 |
Object | newInstance | 创建类的对象 |
3.Field的常用方法
getName 获取属性名
setAccessible 设置是否忽略访问修饰符
set() 设置属性的值
4.Method的常用方法
setAccessible 设置是否忽略访问修饰符
invoke 执行方法
1.6 反射实际应用
解析字符串
Java
复制代码
1
代码语言:javascript复制public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
2
代码语言:javascript复制 String str="name=贝贝&sex=女&info=自恋!";
3
代码语言:javascript复制 //请实现字符串转换为Teacher对象
4
代码语言:javascript复制 //1.解析字符串
5
代码语言:javascript复制 //2.对象创建 属性赋值
6
代码语言:javascript复制 //创建Class对象 -反射
7
代码语言:javascript复制 Class clz=Teacher.class;
8
代码语言:javascript复制 //创建类的对象
9
代码语言:javascript复制 Teacher teacher= (Teacher) clz.newInstance();
10
代码语言:javascript复制 //字符串常用方法 解析字符串 切割& 字符串数组
11
代码语言:javascript复制 String[] strs1=str.split("&");
12
代码语言:javascript复制
13
代码语言:javascript复制 System.out.println(Arrays.toString(strs1));
14
代码语言:javascript复制 //循环遍历 键值对
15
代码语言:javascript复制 for(String s1:strs1){
16
代码语言:javascript复制 //切割=
17
代码语言:javascript复制 String[] strs2=s1.split("=");
18
代码语言:javascript复制 System.out.println(Arrays.toString(strs2));
19
代码语言:javascript复制 //反射 获取指定的属性对象
20
代码语言:javascript复制 Field field=clz.getDeclaredField(strs2[0]);
21
代码语言:javascript复制 if(field!=null){
22
代码语言:javascript复制 //设置忽略访问修饰符
23
代码语言:javascript复制 field.setAccessible(true);
24
代码语言:javascript复制 //赋值
25
代码语言:javascript复制 field.set(teacher,strs2[1]);
26
代码语言:javascript复制 }
27
代码语言:javascript复制 }
28
代码语言:javascript复制 System.out.println(teacher);
29
代码语言:javascript复制 }