反射+注解+泛型

2022-07-21 22:13:10 浏览数 (1)

一、反射

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复制
    }

0 人点赞