反射(入门级)

反射(入门级),第1张

这是一篇作者关于反射的学习笔记,内容主要是个人理解的一个总结,大部分是别人的知识,害怕某一天那么好的博客付费了,所以作者要把学到的知识记下来,这样可以看自己的博客,也就相当于白嫖了😎.

下文引用到的博客:
博客1、『设计模式』反射,反射程序员的快乐!
博客2、【十分钟让你彻底搞懂java反射】
这里给出本篇博客内容的出处,尊重原创

目录
    • 1、反射的实现原理
      • 2、 java代码在计算机经历三个阶段
    • 3、反射的用法
      • 4、获取Class对象的三种方法
      • 5、构造类的实例化对象
      • 6、获取class的所有方法
    • 7、反射的应用场景

1、反射的实现原理

看下面解释~

2、 java代码在计算机经历三个阶段

1、Source源代码阶段:.java被编译成.class字节码文件。
2、Class类对象阶段: *.class字节码文件被类加载器加载进内存,并将其封装成Class对象(用于在内存中描述字节码文件),Class对象将原字节码文件中的成员变量抽取出来封装成数组Field[],将原字节码文件中的构造函数抽取出来封装成数组Construction[],在将成员方法封装成Method[]。当然Class类内不止这三个,还封装了很多,我们常用的就这三个。
3、RunTime运行时阶段: 创建对象的过程new。(new的过程也叫“正射”)
[内容引用第一篇学习博客1]

这样一来可能就理解Class是干嘛的啦~


3、反射的用法

一、在运行时获取一个类的 Class 对象(具体看下文实例)
二、在运行时构造一个类的实例化对象(具体看下文实例)
三、在运行时获取一个类的所有信息:变量、方法、构造器、注解(具体看下文实例)
补充:

什么是动态语言?
    
    动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。
    
    比如JavaScript便是一个典型的动态语言。除此之外如Ruby、Python、OC等也都属于动态语言,而C、C++、Java等语言则不属于动态语言。
    
    动态类型语言,就是类型的检查是在运行时做的,是不是合法的要到运行时才判断,例如JavaScript就没有编译错误,只有运行错误。

什么是静态语言?
    
 而静态类型语言的类型判断是在运行前判断(如编译阶段),比如java就是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要.
     
    Java的反射机制被视为Java为准动态语言的主要的一个关键性质,这个机制允许程序在运行时透过反射取得任何一个已知名称的class的内部信息,包括:
    
    正在运行中的类的属性信息,正在运行中的类的方法信息,正在运行中的类的构造信息,正在运行中的类的访问修饰符,注解等等。
    
    动态语言无时不刻在体现动态性,而静态语言也在通过其他方法来趋近于去弥补静态语言的缺陷。
————————————————
版权声明:本文为CSDN博主「风骨散人Chiam」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43627118/article/details/105890509
什么是静态语言?


这样应该就理解了 动态语言和静态语言 以及 语言的 编译和运行 啦~

4、获取Class对象的三种方法

1、类名.class:这种获取方式只有在编译前已经声明了该类的类型才能获取到 Class 对象

Class<HashMap> hashMap= HashMap.class;

2、实例.getClass():通过实例化对象获取该实例的 Class 对象

Map<String, String> hashMap = new HashMap<>();
Class<? extends Map> hashMapClass = hashMap.getClass();

3、Class.forName(“类的全限定名”):通过类的全限定名获取该类的 Class 对象

Class<?> hashMap= Class.forName("java.util.HashMap");

拿到 Class对象就可以对它为所欲为了:调用它的方法、获取属性、获取类信息
[内容引用博客2]

5、构造类的实例化对象

通过反射构造一个类的实例方式有2种:

1、Class 对象调用newInstance()方法

Class<?> hashMapClass = Class.forName("java.util.HashMap");
HashMap hashMapInstance = (HashMap) hashMapClass.newInstance();

注意:即使 HashMap已经显式定义了构造方法,通过 newInstance() 创建的实例中,所有属性值都是对应类型的初始值,因为 newInstance() 构造实例会调用默认无参构造器。

2、Constructor 构造器调用newInstance()方法

Class<?> hashMapClass = Class.forName("java.util.HashMap");
Constructor<?> constructor = hashMapClass.getConstructor();
constructor.setAccessible(true);
HashMap newInstance = (HashMap) constructor.newInstance();

通过 getConstructor(Object… paramTypes) 方法指定获取指定参数类型的 Constructor, Constructor 调用 newInstance(Object… paramValues) 时传入构造方法参数的值,同样可以构造一个实例,且内部属性已经被赋值。

通过Class对象调用 newInstance() 会走默认无参构造方法,如果想通过显式构造方法构造实例,需要提前从Class中调用getConstructor()方法获取对应的构造器,通过构造器去实例化对象。
————————————————
版权声明:本文为CSDN博主「负债程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33709582/article/details/113550163


这里就需要自己去实现一下。

6、获取class的所有方法

具体方法就不举例了,每个反射博客都有,不可能都付费😎

7、反射的应用场景

1、Spring 实例化对象:当程序启动时,Spring 会读取配置文件 applicationContext.xml 并解析出里面所有的标签实例化到IOC容器中。
    
2、反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对各种新增的类,反射可以使得程序更加健壮。
    
3、JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类
    


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/798633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存