【Java】反射

java反射机制

  1. 什么是反射
  2. java反射提供的功能:
  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时获取泛型信息
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理
  1. 什么时候用反射
    当我们不知道new哪个类的对象,当运行后才知道的时候就应该用反射。这也体现了反射的动态性的特征。其它情况还是用new的方式调用公共的结构
  2. 反射机制与面向对象的封装性是不是矛盾的?如何看到两个技术?
    封装性 private是建议不要调,封装性解决的是建议怎么调的问题
    反射解决的是能不能调的问题

java.lang.Class类

  1. 类的加载过程
    程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。
    接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就称为类的加载加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。
    即Class的实例就对应着一个运行时类。

  2. 哪些类型可以有Class对象
    在这里插入图片描述
    在这里插入图片描述

获取Class实例(重点)

加载到内存中的运行时类,会缓存一定的时间。
在此时间之内,我们可以通过不同的方式来获取此运行时类。|

方式一:调用运行时类的属性 .class

Class clazz1 = Person.class;
//或者加上泛型
Class<Person> clazz1 = Person.class;
System.out.println(clazz1);

方式二:通过运行时类的对象 调用getClass()

Person p1 = new Person();
Class clazz2 = p1.getClass();
System.out.println(clazz2);

方式三:调用Class的静态方法 forName(String classPath) 【用的最多】

Class clazz3 = Class.forName("com.flora.java.Person");
System.out.println(clazz3);

方式四:使用类的加载器 ClassLoader(了解)

ClassLoader classLoader = ReflectionTest.class. getClassLoader();
Class clazz4 = classLoader.loadClass( name:"com.flora.java.Person") ;
System.out.println(clazz4);

类的加载过程与ClassLoader的理解

类的加载过程

在这里插入图片描述
在这里插入图片描述

例子:
在这里插入图片描述

ClassLoader的理解

在这里插入图片描述
在这里插入图片描述

使用ClassLoader加载配置文件

注意用ClassLoad而加载配置文件默认识别地址为当前module的src下
在这里插入图片描述

创建运行时类的对象(重点)

newInstance() 调用此方法,创建运行时类的对象

newInstance() 内部调用了运行时类的空参构造器
空参构造器的访问权限得够,通常设置为public
在这里插入图片描述

获取运行时类的完整结构

  1. 获取运行时类的带泛型的父类的泛型
    在这里插入图片描述
  2. 获取运行时类实现的接口
    在这里插入图片描述
    在这里插入图片描述

调用运行时类的完整结构(重点)

操作运行时类指定的属性

在这里插入图片描述

操作运行时类指定的方法

  1. 调用非静态方法
    在这里插入图片描述
  2. 调用静态方法
    invoke方法的第一个参数为方法的调用者,由于我们调用的是静态方法,所以可以写成Person.class 或null
    在这里插入图片描述

操作运行时类指定的构造器

不需要掌握,一般不用
在这里插入图片描述

反射应用:动态代理

https://www.bilibili.com/video/BV1nJ411A7wC?p=658

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值