0308java基础-注解,反射
一,注解
1.什么是注解:
- Annotation是从jdk5.0开始引入的新技术
- 作用:
- 不是程序本身,可以对程序作出解释
- 可以被其他程序读取
- 格式:
- 以@注释名在代码中存在,还可以添加一些参数值@SuppressWarnings(value="unchecked)
- 在哪里使用:
- 在package,class,method,field等上面使用,相当于给他们天界额外的辅助此信息,我们可以通过反射机制编程实现对这些元数据的访问
2.内置注解
- @Override:此注解适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明
- @Deprecated:可以修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择
- @SuppressWarnings:用来抑制编译时的警告信息,与前两个不同,需要我们添加一个参数才能够正常使用,这些参数都是已经定义好了,我们选择性使用即可
- @SuppressWarnings("all")
- @SuppressWarnings("unchecked")
- @SuppressWarnings(value={"unchecked","deprecation"})
3.元注解:
- 元注解的作用就是负责注解其他注解,java定义了四个标准的meta-annotation类型,他们被用来对其他注解类型做说明
- 这些类型和他们所支持的类在java.lang.annotation包中可以找到
- @Target:用于描述注解的使用范围,即注解可以使用在什么地方
- @Target(value={ElementType.METHOD,.....})
- @Retention:表示需要在什么级别保存该注释信息,用于描述主角的生命周期,表示我们的注解在什么时候还有效
- SOURCE<CLASS<RUNTIME
- @Retention(value=RetentionPolicy.RUNTIME)
- @Documented:说明该注解将被包含在Javadoc中
- @Inherited:说明子类可以继承父类中的该注解
- @Target:用于描述注解的使用范围,即注解可以使用在什么地方
4.自定义注解
- 使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口
- 分析:
- @interface用来声明一个注解,格式:public@interface注解名{定义内容}
- 其中的每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值类型就是参数的类型,返回值只能是基本类型:Class,String,enum
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
-
public class Test01 {//注解可以显示赋值,如果没有默认值,我们就必须给注解赋值@MyAnnotaion(age = 19)public void test() {}@MyAnnotaion2("小俊")public void test02(){} } @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotaion {//注解的参数:参数类型+参数名();String name() default "";int age();int id() default -1;//如果默认值为-1,代表不存在、String[] schools() default {"西部开源", "工商大学"}; } @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotaion2 {//如果只有一个参数,建议使用value作为参数名,这样在使用注解的时候,就可以省略value,直接赋值String value(); }
二.反射机制
1.静态 VS 动态语言
- 动态语言:Object-C, C#,JavaScript, PHP, Python
- 可以在运行的时候,可以根据某些条件改变自身结构
- 静态语言:Java ,C, C++
- java不是动态语言,但可称为准动态语言,因为我们可以利用反射机制获得类似动态语言的特性,可以是编程更为灵活
2.Java Reflection
- 反射是java被视为动态语言的关键,反射机制允许程序在执行期间,借助于Reflection API取得任何类的内部信息,并且能直接操作任意对象的内部属性及方法
- Class c = Class.forName("java.lang.String")
- 加载完类之后,在堆内存的方法区就会产生一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们称之为:反射
- 正常获取对象的方式和反射获取对象的方式是反着来的
3.优缺点
- 优点:
- 可以实现动态创建对象和编译,体现很大灵活性
- 缺点:
- 对性能有影响,使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且让他满足我们的需求,但是这类操作总是慢于直接执行相同的操作
4.主要API:
- java.lang.Class:代表一个类
- java.lang.reflect,Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造器
5.Class类(对象照镜子后可以得到的信息:)
- Class本身也是一个类
- Class对象只能由系统建立对象
- 一个加载的类在JVM中只会有一个Class实例(hashcode都相同)
- 一个Class对象对应的是一个加载到JVM中的.Class文件
- 每个类的实例都会记得自己是由哪个Class实例所生成的
- 通过Class可以完整的得到一个类中所有被加载的结构
- Class类是Reflection的根源,针对任何你想动态加载,运行的类,未有先获得相应的Class对象
6.Class类的常用方法,获得class类实例的方式有哪些
-
//测试class类的创建方式有哪些 public class Test03 {public static void main(String[] args) throws ClassNotFoundException {Person person = new Student();System.out.println("这个人是:" + person.name);//方式一:通过对象获得Class c1 = person.getClass();System.out.println(c1.hashCode());//方式二:forName获得Class c2 = Class.forName("com.kuang.reflection.Student");System.out.println(c2.hashCode());//方式三:通过类名.class来获取Class c3 = Student.class;System.out.println(c3.hashCode());//方式四:基本内置类型的包装类都有一个Type属性Class c4 = Integer.TYPE;System.out.println(c4);//方式5,获得父类类型Class c5 = c1.getSuperclass();System.out.println(c5);} }
7.哪些类型可以有Class对象:
-
//所有类型的class public class Test04 {public static void main(String[] args) {Class c1 = Object.class; //类Class c2 = Comparable.class; //接口Class c3 = String[].class;//一维数组Class c4 = int[][].class;//二维数组Class c5 = Override.class;//注解Class c6 = ElementType.class;//枚举Class c7 = Integer.class;//基本数据类型Class c8 = void.class;//voidClass c9 = Class.class;//classSystem.out.println(c1);System.out.println(c2);System.out.println(c3);System.out.println(c4);System.out.println(c5);System.out.println(c6);System.out.println(c7);System.out.println(c8);System.out.println(c9);//验证同一个类是不是只有一个class对象int[] a = new int[10];int[] b = new int[100];System.out.println(a.getClass().hashCode());System.out.println(b.getClass().hashCode());//结果是相同的,说明数组只要类型名相同,相同维度下,不论长短,class类都相同} }
8.java内存分析
- 堆:
- 可以存new的对象和数组,可以被线程共享
- 栈:
- 存放基本变量类型
- 引用对象的变量
- 方法区:(特殊的堆)
- 可以被所有的线程共享
- 包含了所有的class和static变量
9.类的加载过程
- 类的加载------------------------------------>类的链接--------------------------------------->类的初始化
- 将类的class文件读入内存 类的二进制数据 合并到jre JVM负责对类初始化
- 加载的时候,每个类都会有自己对应的class类对象
- 链接时m=0
- 初始化,static会被合并到类构造器方法clinit()当中,顺序执行
10.什么时候会发生类的初始化:
- 类的主动引用(一定会发生类的初始化):
- 当虚拟机启动,先初始化main方法所在类
- new一个对象
- 调用类的静态成员和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
- 当初始化一个类,如果其父类没有被初始化,则会先初始化其父类
- 类的被动引用(不会发生类的初始化)
- 当访问一个静态域的时候,只有真正声明这个域的类才会被初始化,当通过子类引用父类的静态变量不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化
- 因为常量在链接阶段就已经存入调用类的常量池了
11. 类加载器
- 类加载的作用:
- 类缓存
相关文章:

0308java基础-注解,反射
一,注解 1.什么是注解: Annotation是从jdk5.0开始引入的新技术作用: 不是程序本身,可以对程序作出解释可以被其他程序读取格式: 以注释名在代码中存在,还可以添加一些参数值SuppressWarnings(value"…...

【鸿蒙应用ArkTS开发系列】- 页面跳转及传参
先看下效果图 大致实现的功能点: 从Indext页面跳转到Second页面,传递两个参数,一个字符串,一个数量;Second获取Index页面传递的数据;Second页面点击返回弹窗;Second页面返回携带参数数据&#…...

StringBuilder 类
Java StringBuilder类是一个可变字符串缓冲区,它提供了丰富的方法可以方便地进行字符串操作。与Java StringBuffer类类似,Java StringBuilder类的主要作用是优化字符串的拼接操作,提高代码的效率。在本篇文章中,我们将详细介绍Jav…...

kubectl-k8s用户切换
kubernetes默认使用$HOME/.kube/config配置文件。可以在配置文件中定义多个USER和Cluster的上下文。所以就有两种方式切换用户同一个config中,切换不同用户上下文切换不同的config配置文件同config切换不同用户上下文查看config文件kubeconfig config view查看当前上…...

【面试题】三道面试题让你掌握JavaScript中的执行上下文与作用域以及闭包
前言大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库大家好,笔者呢最近再回顾JavaScript知识时,又看到了JavaScript的一些较为常见的内容,仔细看了之后发现…...

计算机网络-- 应用层(day08)
计算机网络两种方式 网络应用程序运行再处于网络边缘的不同端系统上,通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系。 目前流行的主要有以下两种: 客户/服务器…...

English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一
English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一朗读节奏元音的长度元音发音在清辅音和浊辅音前的区别元音发音跟后面浊辅音节数的区别元音在重读音节中复习大小元音发音对比/ʌ/ 舌中音/ɒ/ 舌后音/ʊ/ 舌后音/ɪ/ 舌前音[ɑ:] VS […...

SpringBoot——统一功能处理
处理登陆拦截 上一片博客中讲到SpringAOP可以对页面进行拦截,我们可以用SpringAOP实现对登陆的拦截 但是由于拦截需要HttpSession对象,并且之后还需要页面重定向,因此在实际应用中,并不用SpringAOP进行登陆拦截,而是…...

ORACLE SQL格式化小数点
ORACLE SQL格式化小数点 select CONCAT(TO_CHAR(0.00100,‘990.999’),‘%’) as a0 , CONCAT(TO_CHAR(1100,‘990.999’),‘%’) as a1 , CONCAT(TO_CHAR(0.236100,‘990.999’),‘%’) as a2 , CONCAT(TO_CHAR(0.0200100,‘990.999’),‘%’) as a3 , CONCAT(TO_CHAR(1.0310…...

【信息学奥数】—— 第一部分 C++语言 知识总结
【信息学奥数】—— 第一部分 C语言 知识总结C语言一、C语言入门二、顺序结构程序设计运算符和表达式常量和变量标准数据类型数据输入输出三、控制结构程序设计if语句switch语句四、循环结构程序设计for语句while语句do-while语句五、数组一维数组二维数组字符数组六、函数七、…...

video层级过高,以及界面使用多个video时,在安卓APP上同时播放的问题(uniapp)
1、video层级过高的问题 问题一: 我的界面由于是自定义导航栏,所以使用video时,上滑界面video会直在最上层,盖着 头部导航栏 解决方法:使用cover-view,自定义头部使用cover-view替换view 问题二:自定义…...

C++基础了解-14-C++ 字符串
C 字符串 一、C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 RUNOOB …...

浅谈几种网络攻击及攻防原理
HTTP Flood攻击 https://zhuanlan.zhihu.com/p/337399808 HTTP Flood攻击是针对Web服务在第七层协议发起的攻击。第七层主要是应用层,是一些终端的应用,比如(各种文件下载)、浏览器、QQ等,可以将其理解为在电脑屏幕上可…...

Kafka消息中间件(Kafka与MQTT区别)
文章目录KafkaKafka重要原理Topic 主题Partition 分区Producer 生产者Consumer 消费者Broker 中间件Offset 偏移量Kafka与mqtt区别Kafka Kafka是一个分布式流处理平台,它可以快速地处理大量的数据流。Kafka的核心原理是基于发布/订阅模式的消息队列。Kafka允许多个…...

Go垃圾回收原理
术语介绍 赋值器:说白了就是你写的程序代码,在程序的执行过程中,可能会改变对象的引用关系,或者创建新的引用。 回收器:垃圾回收器的责任就是去干掉那些程序中不再被引用得对象。 STW:全称是stop the word,GC期间某个阶段会停止…...

Coredump-N: stack 空间被临时变量吃满,导致内存访问出现问题
文章目录 代码寄存器汇编代码 int main() {fun(0); #define S 0x0019fd08UL 、、 乘5 等0x81F128 char buff4[S]; char buff3[S]; char buff2[S]; char buff1[S]; char buff[S]; memset(buff, 0, sizeof(buff)); memset(buff4, 0, sizeof(buff)); memset(buff3, 0, sizeof(buf…...

GO中使用viper读取配置文件
文章目录 viper的使用例子一:例子二:viper的使用 viper的源码地址https://github.com/spf13/viper,它是一个可以用来读取配置文件的工具。在项目中可以通过下面指令安装: go get github.com/spf13/viper 下面我们通过两个例子,来介绍一下viper在项目中应该如何使用…...

webpack dll 提升构建速度
DLL,动态链接库(Dynamic Link Library 或者 Dynamic-link Library),由微软公司提出。目的是为了节约应用程序所需的磁盘和内存空间。 在一个传统的非共享库中,如果两个程序调用同一个子程序,就会出现两份那…...

C++面向对象编程之三:初始化列表、类对象作为类成员、静态成员
初始化列表C提供了初始化列表语法,可以用于成员属性初始化。语法规则:无参构造函数():属性1(值1), 属性2(值2), ... { }有参构造函数(形参1, 形参2, ...):属性1(形参1), 属性2(形参2), ... { }example:写一个怪物类,有怪物id和血量…...

跨域问题解决方案
目录 1.同源策略 2.解决方案(后端) (1)在后端方法添加CrossOrigin (2)添加CORS过滤器 (3)实现WebMvcConfigure接口,重写addCorsMappings方法 3.解决方案(前端) (1)前端配置代理 1.同源策略 同源策略(Same origin policy)是一种约定&am…...

Vue3电商项目实战-购物车模块7【20-登录后-批量删除、21-登录后-选中状态修改数量、22-登录后-全选反选、23-登录后-修改规格、24-下单结算】
文章目录20-登录后-批量删除21-登录后-选中状态&修改数量22-登录后-全选反选23-登录后-修改规格24-下单结算20-登录后-批量删除 目标:完成批量删除选中商品,完成清空失效的商品 大概步骤: 完成cart.js模块中的批量删除actions的登录状态…...

软件测试之快速熟悉项目
快速熟悉项目 1、了解项目架构 C/S架构 C/S 代表的是客户端/服务器(client/server),这类软件的使用者需要在本地电脑安装客户端程序,例如:QQ。 优点:安全性高。 缺点:一旦软件有更新,用户需要手动下载&am…...

软考高级信息系统项目管理师系列之二十一:项目风险管理
软考高级信息系统项目管理师系列之二十一:项目风险管理 一、项目风险管理内容整理二、项目风险管理1.风险及项目风险管理定义2.项目风险的特点3.风险的分类4.风险成本5.项目风险管理与其他管理的关系三、规划风险管理1.规划风险管理2.输入3.工具与技术4.输出四、识别风险1.识别…...

打包成JAR文件和WAR文件,到底有什么区别?
Spring Boot是一种基于Spring框架的快速开发应用程序的工具,可以轻松地构建可部署的独立应用程序。在使用Spring Boot时,你可能会注意到有两种不同的部署选项:打包成JAR文件和WAR文件。在这篇文章中,我们将深入探讨这两种部署选项…...

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)
STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1) 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…...

在教学中常被问到的几个vue3.x与typescript的问题,统一解答
在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…...

纯css实现超炫酷的星空背景按钮
也是在制作项目时发现的,找了很多demo,一点一点测试,发现这个按钮也是非常的炫酷 用到了几个属性,keyframes,::after,::before 先了解一下他们分别都是干嘛的 keyframes 关键帧 keyframes at-rule 规则通过在动画序…...

openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正
文章目录openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正概述笔记实验前置条件实验开始建立自己板子上的Mark点封装, 用于自己人工圈定判断Mark点位置是否正确建立mark点封装根据多个mark点, 来精确定位板子左下角原点坐标ENDopenpnp - 贴片前, 放入一块新板子后, 对板子…...

计及需求响应的改进灰狼优化算法求解风、光、柴、储容量优化配置(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

Elasticsearch使用——高级篇
1.数据聚合**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如何?实现这些统计功…...