反射机制.

news/2023/6/8 0:03:20

文章目录

  • 概述
    • 两个疑问
    • 关于java.lang.Class的理解
  • 获取Class实例的方式
  • 哪些类型可以有Class对象
    • 了解类的加载器
  • 掌握加载配置文件的另一种方式
  • 创建运行时类的对象
  • 体会动态性
  • 获取运行时类的完整结构
  • 调用运行时类的制定结构
    • 每日一考
  • 动态代理

概述

1、反射是动态语言的关键
2、动态语言:通俗的说,就是代码在运行时可以根据某些条件改变自身结构,如python、PHP
静态语言:运行时结构不可变的语言就是静态语言,如Java、c++
Java不是动态语言,但其具有“准动态性”,因为反射机制,Java有一定的动态性

两个疑问

1、通过直接new的方式还有反射的方式都可以造对象,开发中用哪个?
建议用new;一般涉及动态性时,会用反射
2、封装性和反射机制是否矛盾,如何看待?

关于java.lang.Class的理解

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

获取Class实例的方式

1、方式一:调用运行时类的属性:.calss

在这里插入图片描述

2、方式二、通过运行时类的对象,调用getClass方法

在这里插入图片描述

3、方式三、调用Class的静态方法forName(String classPath),classPath是指定类的全类名,即是包含包名在内的类的完整路径(使用频率高)

在这里插入图片描述

【补充】
加载到内存中的运行时类,会缓存一段时间。在此时间内,我们可以通过不同的方式获取运行时类

在这里插入图片描述
虽然获取的方式不同,但通过后面的两个system.out语句都返回true,能看出不同方式获取的都是同一个运行时类(比较的是地址)

4、方式四、使用类的加载器:ClassLoader(了解,前三种掌握)

在这里插入图片描述
其中,ReflectionTest是我们写代码所在的测试类的名字,所有的代码都写在当前包的ReflectionTest文件下
在这里插入图片描述

哪些类型可以有Class对象

在这里插入图片描述
【补充】数组元素的类型和维度一样的情况下,其对应的Class对象相同,是同一个

在这里插入图片描述
返回true

了解类的加载器

1、对于自定义类,使用系统类加载器进行加载
2、调用系统类加载器的getParent方法:获取扩展类加载器
3、调用扩展类加载器的getParent方法:无法获取引导类加载器
引导类加载器主要加载Java的核心类库,无法加载自定义的类

掌握加载配置文件的另一种方式

在这里插入图片描述

创建运行时类的对象

1、newInstance():调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
要想此方法正常创建运行时类的对象,要求:
①运行时类要有空参构造器
②空参构造器的访问权限得够,一般都设置为public
javabean中要求提供一个public的空参构造器,原因:
①便于通过反射,创建运行时类的对象
②便于子类继承此运行时类,调用super()时,父类有此构造器

在这里插入图片描述

体会动态性

在这里插入图片描述
根据运行时生成的随机数,才能够确定是创建哪个运行时类的对象(其实是创建类的对象,会将这个类加载到内存,然后就会产生一个对应的运行时类)

获取运行时类的完整结构

1、获取属性:
getFields():获取当前运行时类及其父类中声明为public的属性
getDeclaredFields():获取当前运行时类的所有属性,不考虑权限,不包含父类的属性
2、方法
getMethods():获取当前运行时类及其父类中声明为public的方法
getDeclaredMethods():获取当前运行时类中的所有方法,不包括父类
3、构造器
getConstructors():获取当前运行时类中声明为public的构造器,不包含父类的
getDeclaredConstructors():获取当前运行时类中所有的构造器
4、父类
getSuperclass()
5、带泛型的父类
getGenericSuperclass()
6、带泛型的父类的泛型
在这里插入图片描述
这里是因为父类中只有一个泛型,所以直接输出数组的0位置上的元素,其实应该遍历数组
注释掉的方法也可以得到结果,上下两种是不同的方式
7、接口
getInterfaces():获取运行时类的接口
8、包
getPackage():获取运行时类所在的包
9、注解
gatAnnotations():获取运行时类的注解

调用运行时类的制定结构

调用:属性、方法、构造器
1、如何操作运行时类的指定属性(掌握)
在这里插入图片描述
2、如何操作运行时类的指定方法(掌握)
①非静态方法:
在这里插入图片描述
②静态方法
showDesc是Person中的静态方法
在这里插入图片描述
3、如何操作运行时类的构造器(了解)
常用前面说的newInstance
在这里插入图片描述

每日一考

在这里插入图片描述

动态代理

1、静态代理举例
特点:代理类和被代理类在编译期间就确定下来了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、动态代理举例
特点:代理类在编译期间没有显式定义,而是在运行时根据传进来的被代理类的对象,动态的创建
在这里插入图片描述
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4554399.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

拥抱蓝筹,我选格力电器

19年享受了2个涨停,随便写写。 2017年9月,开始买股票,也看了不少公司的年报。 投资的本质,就是公司好不好,好的情况多好,坏的情况多差,以及稳定性。 风险、收益、流动性。 为什么推荐格力电…

英语学习打卡day1

2023.1.19 重点单词 1.speculation n.推测,投机 speculate v. speculative adj. spectate v.看 spectator inspect 检查(往里看) aspect 外观(看一眼) 2.literally adv.(强调事实可能令人惊讶)真正地,…

猿辅导专项答疑:如何快速迅速进入学习状态?

最近大家焦虑的事情是否是这件?——开学已经过了好久,自己还迟迟进入不了学习状态,这可怎么办?猿辅导发现,很多同学成绩不优异并不是因为他们在学习上没花时间和精力,而是学习效率不高,导致自己…

基于python的简单KNN算法(K- Nearest Neighbor)的实现与改进

最近在自学python的数据分析,还想稍微蹭一蹭深度学习,于是不可避免地接触到了最简单的机器学习算法——KNN算法。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数…

从开发者角度解析 Android N 新特性!

大清早看到 Google 官方博客发布 Android N 的开发者预览版,立马从床上跳起来开始仔仔细细的读起来。 从开发者角度来看,Android N 的更新并不算大。网上之前流传的一些 Android N 可能出现的新特性,什么夜间模式,抽屉の消失&…

看源码,搞明白Logback是如何自动生效的?

导语: private static final Logger logger LoggerFactory.getLogger(ClassName.class);对于使用Springboot的Java开发的人员来说,当你使用Slf4jLogback的日志框架时,这行代码一定不陌生。细心的人会发现,Logger类和LoggerFactor…

计算机学院第一周语法组及算法组作业

目录 语法组 费马定理 zhuzhu不会运算 期待已久的告白 Hello, ACM\ 233 算法组 查找 石头剪刀布(生活大爆炸版) 不高兴的津津 进击的奶牛 寻找第一个大于等于 数字统计 数的范围 买铅笔 语法组 费马定理 题目描述 上了大学之后&…

极大提高国人开发效率超实用的 VS Code 插件

相信好多英语不好的同学在打代码的时候,经常会遇到不懂的单词,也相信好多时候同学写项目时候忘记框架的接口,需要网上翻阅文档,线上提问求助,参考其他项目的示例,那么如果你都过遇到这类问题,那…