• 一篇文章搞定你不得不懂的反射!


    微信公众号:程序媛的非程序人生

    关注可了解更多资讯。问题或建议,请公众号留言;

    内容目录

    一、反射相关概念

    二、应用场景

    三、反射中Class的获取方式

    四、创建类对象的方式

    五、用代码说话

    六、反射优缺点

    一、反射相关概念

    1、编译期 & 运行期

    编译期:编译器把源代码翻译成机器能识别的代码,如Java代码编译成jvm识别的字节码文件。

    运行期:将可执行文件交给操作系统去执行。

    2、静态加载类 & 动态加载类

    静态加载类:编译时刻加载类

    动态加载类:运行时刻加载类

    3、反射:

    【说法一】

    在运行状态中,

    对于任意一个类, 都能够知道这个类的所有属性和方法;

    对于任意一个对象,都能够调用它的任意方法和属性,并且能改变它的属性;

    这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。

    【说法二】

    允许程序在运行时取得任何一个已知名称的class的内部信息,包括修饰符,属性,方法等,并可于运行时改变属性内容或调用方法

    【说法三】

    反射是运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

    【说法四】

    通过字节码文件,使用相应的类,成员变量,方法,注解等。

    【说法五】

    在运行时判断任意一个对象所属的类;

    在运行时构造任意一个类的对象;

    在运行时判断任意一个类所具有的成员变量和方法;

    在运行时调用任意一个对象的方法;

    生成动态代理。

    注:5种说法皆可

    4、相关类

    Class类:代表类的实体,在运行的Java应用程序中表示类和接口

    Field类:代表类的成员变量(即类的属性)

    Method类:代表类的方法

    Constructor类:代表类的构造方法

    二、应用场景

    1、JDBC原生代码注册驱动

    2、Hibernate的实体类

    3、Mybatis框架

    4、Spring的AOP等

    原理:

    在配置文件(xml或properties)里配置好相关信息,java代码解析配置文件信息,运用反射机制,根据获取的配置信息(值)获取Class实例,进行动态配置。

    如:Mybatis框架

    通过读取sql,得到字段名称(与属性名相同)并用反射的方式将对象创建出来,调用其set方法进行参数注入,最后放到List中。

    三、反射中Class的获取方式

    1、Class personClazz = new Person().getClass();

    2、Class personClazz =Person.class;

    3、Class personClazz = Class.forName("com.demo.Person");

    四、创建类对象的方式

    1、通过Class对象的newInstance()——>只能使用默认的无参数构造方法

    Class clz = Person.class;

    Person person = (Person)clz.newInstance();

    2、通过Constructor对象的newInstance()

    Class clz = Person.class;

    Constructor constructor = clz.getConstructor();

    Person person = (Person)constructor.newInstance(“张三”,18);

    五、用代码说话

    1、基础类

    接口类:MyInterface.java


     

    接口类:MyInterface2.java


     

    对象类:Person.java


     

    对象类:Student.java


     

    工具类:PropertyUtil.java


     

    配置类:class.txt


     

    2、测试内容

    demo1:获取反射对象(反射入口)

    demo2:获取方法:1、所有的公共方法 2、当前类的所有方法

    demo3:获取所有的接口

    demo4 :获取所有的父类

    demo5 :获取所有的构造方法

    demo6 :获取所有的公共属性

    demo7 :获取当前反射所代表类(接口)的对象(实例)

    demo8 :获取对象实例,并操作对象

    demo9 :操作方法

    demo10:获取指定的构造方法

    demo11:动态加载类名和方法

    demo12:越过泛型检查

    demo13:给任意对象、任意属性 赋值

    (1)获取反射对象的三种方式


     

    (2)获取方法:

    1、所有的公共方法 :A、本类以及父类、接口中的所有方法 B、符合访问修饰符(公有) (无private方法)

    2、当前类的所有方法:A、只能是当前类,B、忽略访问修饰符限制


     

     

    (3)获取所有的接口


     

    (4)获取所有的父类


     

    (5)获取所有的构造方法


     

    (6)获取所有的公共属性


     

    (7)获取当前反射所代表类(接口)的对象(实例)


     

    (8)获取对象实例,并操作对象


     

    (9)操作方法


     

    (10)获取指定的构造方法


     

    (11)动态加载类名和方法


     

    (12)越过泛型检查

    Java集合中的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了


     

    (13)给任意对象、任意属性 赋值


     

    六、反射优缺点

    优点:

    1、在运行时检测或修改程序行为,提高程序的灵活性、扩展性

    2、降低耦合性,

    3、提高自适应能力

    缺点:

    1、性能较低:包含动态类型,JVM无法对此进行优化;同时解析操作的效率远低于直接代码

    2、安全限制:程序必须在一个没有安全限制的环境中运行

    3、内部暴露:可以执行在正常情况下不被允许的操作(比如访问私有属性、方法、去泛型化等),可能会导致不可预见的副作用,出现代码功能性错误,降低可移植性,破坏抽象性。


    如果你觉得该篇对你有帮助,欢迎关注公众号

  • 相关阅读:
    VIM技巧, .vimrc文件
    vSphere Client克隆虚拟机
    vSphere、 ESXi、Vcenter、vSphere Client关系
    消耗系统内存
    zabbix2.4汉化
    普通用户执行ansible权限被拒绝
    putty秘钥转换成xhell支持的格式
    zbb20170922 mysql 字符集设置 比较 utf8_general_ci、utf8_unicode_ci和utf8_bin的区别
    zbb20170920 页面调用qq
    zbb20170919 tomcat 8 启动异常 Could not publish server configuration for Tomcat v8.0 Server at localhost. Multiple Contexts have a path of "A".
  • 原文地址:https://www.cnblogs.com/nicole-star/p/10593573.html
Copyright © 2020-2023  润新知