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…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

