【Java从入门到头秃专栏 8】语法篇(七) :反射 动态代理 注解

目录

1 反射机制

2 反射的应用:动态代理 

3 注解


1 反射机制

        反射机制(Reflect Machanism),是指在程序运行期间借助Reflect API获取任何类的内部信息,并能直接操作对象的内部属性以及方法,Java本身而言是静态语言但是由于Java反射机制的存在又被人们视为是动态语言。动态语言就是一类在运行时可以改变其结构的语言,反之而言的就是静态语言概念。

        类被加载完成之后,在堆内存的方法区中就产生了一个Class类型的对象,这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以这个过程被形象的称为是反射。

        Java提供了一个类java.lang.Class,通过类名.class获取这个类编译之后的class文件对象,再通过这个class对象解析得到这个类的所有成分包括:构造器对象(Constructor)、成员变量对象(Field)、成员方法对象(Method)。

反射技术第一步:获取Class类对象

一 : 类名.class
二 : 对象.getClass()
三 : Class.forName("类的全限名")

 获取class对象的名称

反射技术第二步:获取类成分

获取构造器对象:

⚠  在按照参数匹配构造器的时候,参数的先后顺序唯一固定一个构造器,一般都是使用带有declared的方法,不加declared的方法功能太差只能获取public方法。 

通过构造器对象创建对象:

⚠  如果构造器被私有化了的话,也就是说构造器被private修饰了,需要使用构造器对象名.setAccessible(true)暴力打开私有构造器的权限

获取变量对象:

获取

使用变量对象取值赋值 

获取方法对象:

获取方法对象:

 使用方法对象执行方法:

总结

第一步,获取class类对象

第二步,获取构造器对象去new一个对象 

第三步,通过对象可以设置对象的变量值或者调用对象中的方法

获取成员变量并取值赋值 

调用方法

  

⚠  反射不仅可以破坏面向对象的封装性(暴力反射),还可以破坏泛型的约束性,具体原因是泛型是在编译阶段的约束,在编译完成运行时会被擦除泛型约束此时就可以无视泛型约束了,而反射就是在运行时改变操作对象结构的一种机制,于是可以使用反射来破坏泛型的约束性。

反射综合案例

2 反射的应用:动态代理 

什么叫做代理设计模式?

        代理就是使用一个代理将对象包装起来,然后使用该代理对象取代原始对象,任何对于原对象的调用都要经过代理实现,代理对象决定了是否以及何时将方法调用转到原始对象上去。其中代理模式包括两种:静态代理、动态代理。

静态代理:

        静态代理就是代理类和目标对象的类都是在编译期间就确定下来的,不利于程序的扩展,同时每一个代理类都只能为一个接口所服务,这样一来程序的开发中必然会产生过多的代理。

第一步:定一个共用接口

 第二步:定义一个被代理类实现共用接口

第二步:定义一个代理类实现共用接口 


第四步:创建代理类对象并调用他的方法,在代理类方法定义的时候会被引用代理对象调用被代理类方法,具体何时引用被代理对象要取决于代理类的方法何时引用,所以说代理对象决定了是否以及何时将方法调用转到原始对象上去

动态代理:

        动态代理指的是客户通过代理类来调用其他对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。相较于静态代理,动态代理将抽象角色(接口)中声明的所有方法都转移到处理器的一个集中方法中进行处理,这样一来我们就可以更加灵活和统一的处理中多方法。

第一步:创建一个共用接口

第二步:定义一个被代理类实现共用接口 

第三步:定义一个代理工厂类用于实现创造代理类的功能,代理工厂类不直接实现共用接口,而是利用反射实现与被代理类一样的接口,代理类调用被代理类的同名方法要通过handler对象实现,handler对象则是实现了InvocationHandler接口的类创建(new)出来的,这个类底层重写了invoke方法使用反射去调用被代理类的同名方法

代理工厂

 实现了InvocationHandler接口的类

第四步:创建代理类对象并调用他的方法,进而调用被代理类的方法

  

⚠  这个代理工厂不只可以代理被代理类siChuanPeople类,还可以代理上个静态代理案例中的被代理类HxekClothFactory类,因为使用了反射,所以代理工厂可以动态的创建所需要的代理类,而不需要用一个创一个

 ⚠  动态代理只需要理解第三步的具体步骤即可,其他三步与静态代理的写法一样。

注解

        注解(Annotation)实际上就是代码里的一些特殊标记,这些标记可以在编译、类加载、类运行的时候被读取,并执行相应的处理。注解可以想修饰符一样使用,用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annation的键值对"name=value"中。

        Java SE阶段使用的注解比较少,主要是未来框架的学习注解会被频繁的使用,框架=注解+反射+设计模式。

JDK中内置的三个基本注解:

@Override

        @Override注解就是在继承父类时可能会需要重写父类中的方法,还有就是实现一个接口必须重写接口中的抽象方法。只要是重写方法的时候就可以使用@Override注解,@Override注解的作用是:对重写的方法规范化,一般来说重写方法需要做到方法的声明和参数列表相同方法体可以不同,凡是重写方法时没有遵守规范@Override注解就会报红,说明重写方法失败

 @Deprecated 

         @Deprecated​​​​注解表示其所修饰的元素(类、方法……)已经过时,虽然不影响该元素的继续使用,但是建议最好还是不使用。

过时比较多的当属Date类,以下注解就表明下面的构造器已经过时,不推荐使用

@SuppressWarnings

        @SuppressWarnings注解用于抑制编译器警告,比如说定义一个变量但是并没有在下文中对这个变量进行引用,这是就会在编译器也就是IDEA右边报一个警告,警告不会影响代码的运行。

加上@SuppressWarnings注解之后这个警告就会消失,哪怕这个变量依然没有在下面进行引用,此时编译器右边没有了黄色警告

        元注解就是用于注解(修饰)其他注解的注解

JDK中内置的四个元注解:

@Retention

        @Retention注解用于指定被修饰注解的生命周期。注解中包含了一个RetentionPolicy类型(枚举类)的成员变量,有以下三种取值

  • RetentionPolicy.SOURCE:在源文件中有效,编译阶段丢弃不会在编译之后的.class文件中存在的
  • RetentionPolicy.CLASS:在class文件中有效,保存在编译之后的.class文件中不会在运行时进行加载。注解上不声明@Retention的话默认就是取这个值
  • RetentionPolicy.RUNTIME:在运行时依然有效,也就是说可以使用反射进行成分的获取……

@Target

        @Target注解用于指定被修饰的注解能用于修饰哪些程序元素。注解中也定义了一个枚举类,里面包含以下值

  • TYPE:类、接口(包括注释类型)或枚举声明,
  • FIELD:字段声明(包括枚举常量)
  • METHOD:方法声明
  • PARAMETER:正式的参数声明
  • CONSTRUCTOR:构造函数声明
  • LOCAL_VARIABLE:局部变量声明,
  • ANNOTATION_TYPE:注释类型声明
  • PACKAGE:包声明
  • TYPE_PARAMETER:类型参数声明
  • TYPE_USE:类型的使用

@Documented

        @Documented注解指定被修饰的注解将会在编译时被javadoc工具提取成为文档。也就是说经过javadoc编译之后的class文件中依然会保留这个注解,正常情况下经过编译之后的.class文件不会保留注解。

@Inherited

        @Inherited注解指定被修饰的注解将具有继承性。也就是说,当一个注解加上 @Inherited修饰之后,被这个注解修饰的类的子类也同时被这个注解所修饰了(继承性)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 2】Spring相关API 数据源(连接池)的配置 注解开发 整合junit

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 4】 Spring集成web环境 SpringMVC初识

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 ​…

IntelliJ IDEA里的项目搞崩了怎么办,本地历史版本回退拯救你崩溃的心灵

💥写在前面: 如果你还没有读过雨果的悲惨世界也没有读过余华的活着,那你可以看看我今天早上的经历,如果不想听我胡侃的话,直接进入正题: 目录 本地历史的强大 今天早上打开IntelliJ IDEA继续ssm模块的代码练…

【SSM面向CRUD编程专栏 5】使用SpringMVC进行数据响应以及获取请求数据

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 7】springAop 事务控制

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 8】一篇博客快速上手使用MyBatis进行CRUD

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

【SSM面向CRUD编程专栏 9】SSM框架整合

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

三万字速通SSM框架入门知识点,快速上手CRUD

🛫更多ssm知识见SSM_面向CRUD编程专栏 🚕本博客总结自黑马程序员的ssm框架视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 目…

无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

问题简介 本人是在进行一个ssm框架项目的编写的时候,在数据库中查询到所有的商品信息并返回到页面使用EL表达式进行展现,但是使用tomcat 9.0.58运行的时候报错会出现以下报错情况。 页面报错: 控制台报错: 解决方法 首先看看是不…

check the manual that corresponds to your MySQL server version for the right syntax to use near

首先判断自己是在什么情况下报的错,如果是MyBatis的SQL报错的话,建议直接点击目录跳转到MyBatis时SQL报错,避免浪费时间。如果本文能够对你有所帮助的话,还请在评论区多多支持 目录 🍻运行SQL语句、SQL文件等报错 &…

MyBatis的逆向工程工具,自动生成数据库对应的POJO实体类、mapper接口、增删改查mapper.xml文件

下载MyBatis的逆向工程工具,并解压缩到一个不包含中文字符的文件夹下,我直接放到了D盘下,下载地址:MyBatis逆向工程工具下载 如何使用MyBatis的逆向工程工具 下载之后使用idea在一个新窗口中打开,选中工具文件之后&am…

『收藏向 期末SSM课设救急』 教你从搭建到测试运行手撸一个SSM项目实战,附带源码,前端页面、解析和一般遇到的问题(排雷)

🛫ssm知识学习见SSM_面向CRUD编程专栏 🚕本项目来自动力节点的【米米商城】 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 项目…

【SpringBoot 2】(一)基础知识了解学习

🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 ​ 目录…

【SpringBoot 2】(二)快速入门案例HelloWorld

🛫更多知识总结见SpringBoot 2专栏 ( 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 ​ 目…

【SpringBoot 2】(三)SpringBoot相较于Spring的特点

🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客主页🚀🚀 ​ 目录…

井通swtc能不能涨到2元_买一支2块到3块之间的股票,买几十万股吗?这样操作效果怎么样?...

有很多新股民有一种看法,认为高价股风险很大,那么可不可以买2到3元的低价股,是不是风险就很小,以后上涨的力度就会很大?这是很多股民都存在的一个误区,也是很多股市的所谓高手的误导,他们说&…

cad应用程序的组件中发生了未经处理的异常_什么是CAD/CAM?

与许多其他行业一样,牙科技术的生产阶段也越来越自动化。由于牙科实验室工作的价格已成为治疗计划和治疗的主要因素,因此自动化可以在西欧和美国等高薪地区实现更具竞争力的生产。现在,计算机技术的进步使高性价比的单件生产成为可能。近年来…

【SpringBoot 2】(四)详析SpringBoot的常用注解

🛫更多知识总结见SpringBoot 2专栏 🚕本篇知识点总结自尚硅谷雷神的视频 🚒博主对于该知识尚在学习阶段 🚄如果发现存在问题请毫不吝啬的指出 🚀🚀扎哇太枣糕的博客首页🚀🚀 目录 向…