Java反射

Java反射

  • 什么是反射
  • 反射常用类
  • 反射的优缺点
  • Class类
  • Class类常用方法
    • 获取Class的名字、包名、父类、接口
    • 获取Class的构造方法并使用
    • 获取Class属性
    • 获取Class的方法
    • 使用反射实现一个可以调用任何对象方法的通用方法
  • Class对象
  • 获取Class对象的六种方式
  • 类加载
    • 类加载流程
  • 获取类结构信息
  • 通过反射创建对象
  • 通过反射操作属性
  • 通过反射操作方法
  • 反射调用优化

什么是反射


Java反射_第1张图片

Java反射_第2张图片

反射常用类

Java反射_第3张图片

在这里插入图片描述

反射的优缺点

Java反射_第4张图片

Class类


1.Class也是类,因此也继承Object类
Java反射_第5张图片
2.Class对象不是new出来的,而是系统创建的
在加载阶段,就会在堆中创建类对象

3.对于某个类的Class类对象,在内存那种只有一份,因为类只加载一次
Class对象相当于一个模板
Java反射_第6张图片
Java反射_第7张图片

Class类常用方法

获取Class对象

命令 解释
Class cls = Class.forName(“java.lang.Cat”) 多用于配置文件,读取类全路径,加载类
Class cls = Cat.class 多用于参数传递
Class cls = 对象.getClass() 通过创建好的对象,获取Class对象
ClassLoader cl = 对象.getClass().getClassLoader()
Class cls = cl.loadClass(“类的全类名”)
通过类加载器获得
Class cls = 基本数据类型.class 获取基本数据类型的class对象
Class cls = 包装类.TYPE 获得包装类的Class对象

Class对象的基础命令

命令 解释
cls.getName() 获取对象的名词
cls.getSimpleName() 获取简单类名
cls.getPackage().gameName() 获取类对象包名
cls.getSupercls().getName() 获取类对象父类
cls.getInterfaces() 获取类对象接口
cls.getSuperClass 以Class形式返回父类信息
cls.getInterfaces 以Class[]形式返回接口信息
cls.getAnnotations 以Annotation[]形式返回注解信息

获取构造方法

命令 解释
cls.getConstructors() 获取类对象所有的构造方法
cls.DeclaredConstructors 获取本类中所有方法
cls.getConstructor() 获取类对象的无参构造
cls.newInstance() 使用无参构造创建一个对象
cls.getConstructor(String.cls,int cls) 获取类中的带参构造
cls.newInstance(“王五”,20) 使用有参构造创建一个对象
constructor.getModifiers 以int形式返回修饰符
constructor.getName 返回构造器名(全类名)
constructor.getParameterTypes 以Class[]返回参数类型数组

获取属性

命令 解释
cls.getField() 获取属性(字段)公开的字段,父类继承的字段
cls.getDeclaredFirelds() 获取所有属性包括私有,默认,保护
cls.getFields(“name”) 获取单一属性(name为属性名)
Field namefield = cls.getFields(“name”)
Person p = (Person)cls.newInstance()
namefield.set(p,“张三”)
赋值/修改属性的值
Field namefield = cls.getFields(“name”)
Person p = (Person)cls.newInstance()
namefield.get( p )
获取属性的值
field.getName() 返回属性名
field.getType() 以Class形式返回类型
field.getModifiers 以int形式返回修饰符

获取方法

命令 解释
cls.getMethods() 获取公开的方法和父类继承的方法
cls.getDeclaredMethods() 获取公开的方法和私有方法,不能获取父类继承的方法
cls.getMethod(“eat”) 获取无参方法
cls.getMethod(“eat”,String.cls) 获取带参方法
cls.getDeclaredMethod() 获取私有方法
Method eatMethod = cls.getMethod(“eat”)
eaMethod.invoke(zhangsan)
执行无参方法
zhangsan,eat();
Method eatMethod = cls.getMethod(“eat”,String.cls)
eaMethod.invoke(zhangsan,“香蕉”)
执行带参方法
zhangsan.eat(“香蕉”)
Method eatMethod = cls.getMethod(“eat”)
eatMethod.invoke(null)
执行无参静态方法
Person.eat()
Method eatMethod = cls.getMethod(“eat”,String.cls)
eaMethod.invoke(null,“香蕉”)
执行带参静态方法
Person.eat(“香蕉”)
method.getReturnType() 以Class形式获取返回类型
method.getName() 返回方法名
method.getParameterTypes 以Class[]返回参数类型数组

爆破

命令 解释
construcrtor.setAccessible(true) 使反射可以访问private构造器
field.setAccessible(true) 使反射可以访问private属性
method.setAccessible(true) 使反射可以访问private方法

Java反射_第8张图片
Java反射_第9张图片
Java反射_第10张图片

获取Class的名字、包名、父类、接口

Java反射_第11张图片
Java反射_第12张图片

获取Class的构造方法并使用

Java反射_第13张图片
Java反射_第14张图片

获取Class属性

Java反射_第15张图片

获取Class的方法

获取类的所有方法
Java反射_第16张图片
Java反射_第17张图片

获取类的单一方法
Java反射_第18张图片
Java反射_第19张图片

使用反射实现一个可以调用任何对象方法的通用方法

Java反射_第20张图片
在这里插入图片描述
Java反射_第21张图片

在这里插入图片描述

Class对象

Java反射_第22张图片
Java反射_第23张图片
Java反射_第24张图片

获取Class对象的六种方式


Java反射_第25张图片

Java反射_第26张图片
Java反射_第27张图片

类加载

Java反射_第28张图片

类加载流程

Java反射_第29张图片

加载阶段

验证

准备
Java反射_第30张图片
在这里插入图片描述

解析
符号引用转换为内存地址引用
Java反射_第31张图片
初始化

获取类结构信息


Java反射_第32张图片

Java反射_第33张图片
Java反射_第34张图片
Java反射_第35张图片
Java反射_第36张图片
Java反射_第37张图片
Java反射_第38张图片

Java反射_第39张图片

通过反射创建对象


Java反射_第40张图片
Java反射_第41张图片
Java反射_第42张图片

通过反射操作属性

Java反射_第43张图片
Java反射_第44张图片

Java反射_第45张图片
Java反射_第46张图片

通过反射操作方法

Java反射_第47张图片
Java反射_第48张图片
Java反射_第49张图片
Java反射_第50张图片
在这里插入图片描述

练习
Java反射_第51张图片

Java反射_第52张图片

反射调用优化


Java反射_第53张图片

你可能感兴趣的:(Java,java,开发语言,后端)