注解和反射学习笔记
1.1 介绍
-
作用:对程序做出解释,可被其他程序读取,如编译器等;有检查和约束功能;
-
格式:“ @注释名(参数值) ”;
-
使用场景:package,class,method,field;通过反射机制实现对元数据的访问;
1.2 内置注解
-
@Override:只适用于修辞方法(method),表示一个方法声明重写超类中的另一个方法声明;定义在java.lang下;
-
@Deprecated:表示不鼓励使用,适用于修辞方法、属性、类,代码上会出现删除线效果;
-
@SuppressWarnings:用于抑制编译时的警告信息,如定义变量后未使用有警告,使用后警告消失;有参数,直接使用即可;
1.3 元注解 meta-annotation
-
作用:注解其他注解,对其他注解进行说明,多用在写自定义注解时;
-
具体:
key: 查看源代码确认作用域.
-
@Target:用于描述注解的使用范围,如类、方法或构造器上;
-
@Retntion:用于描述注解的生命周期,在什么级别还有效,RUNTIME(运行时有用) > CLASS(成为类时有用) > SOURCE(源代码中有用),一般都是RUNTIME;一般是固定形式:
-
@Documented:是否将我们的注解生成在JAVAdoc中;
-
@ Inherited:表示子类可以继承父类的注解,注意只对类有用,其他类型不会继承;
-
1.4 自定义注解
-
形式:(一般固定形式)
//写自定义注解时,加一些元注解 @Target({ElemenType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation{ String name(); }
-
具体:
key: 注解的参数不是方法.
-
参数可以设置默认值:
-
注解可以显式赋值,若无默认值则必须赋值:上面是自定义注解的使用,使用时参数赋值可以不按顺序,下面是注解的具体内容:
-
若只有一个值,一般用value命名,使用时可直接赋值,不用写参数名(只在参数名为value是省略);
-
2 反射 Reflection
2.1 概述
-
静态与动态:
-
动态:可以在运行时根据某些条件改变代码结构;
-
静态:运行时结构不变’
-
-
反射:允许程序在执行时借助Reflection API取得任何类的内部信息,并可以直接操作任意对象的内部属性和方法;
-
方法:getClass()方法;
2.2 获取反射
-
Class类:管理反射的核心类,Class本身是类,Class对象只能由系统创建,类加载加载之后,会有一个Class类型的对象,一个类只有一个Class对象,这个对象有这个类完整的结构信息,因此可以透过对象看类:
-
特点:灵活但是影响性能;
-
实例:
-
在类的主方法中使用:(注意大写)
这个Class类有很多方法;
-
底层逻辑:每个程序唯一的class是Object的扩展对象,Object对象中定义了Class类的getClass方法,而Class是所有类的源头,所以才可以建Class类来获得当前类的完整信息,即通过对象来获取类的信息:
-
-
获取Class类的方法:
key: 对于每个类,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了某个特定结构的相关信息.
-
Class类的常用方法:、
-
获取方法
-
实例:下图利用上图的类进行演示,这里面删除了一些泛型
结果:
-
2.3 不同类型的Class对象
-
实例:
key: 只要元素类型和维度一样,就是同一个Class,如一维数组长度不同也是同一个类.
输出:
-
内存中的类:
key: 加载、链接与初始化.
-
加载:将class文件的字节码加载到内存,静态转动态,生成代表这个类的Class对象,因此每次都是获取而不能自己创建;
-
链接:将二进制代码合并进JVM的运行状态中,需要验证、准备(为static修饰的分配内存、设置变量初始值,都在方法区中)和解析过程(符号引用替换为直接引用);
-
初始化:JVM执行类构造器(构造类的信息);初始化时若子类的父类没初始化,先初始化父类;保证正确;
-
2.4 通过反射获取注解
-
ORM:对象关系映射(Object Relation Mapped),类与表、属性与字段、对象和记录;
-
用法:通过反射机制来获得自定义注解的内部信息;
-
实例:上图为使用注解,下图为自定义注解内容
原文地址:https://www.cnblogs.com/youngsam/p/15003355.html
- Flash/Flex学习笔记(56):矩阵变换
- js小技巧:tab页切换
- c#字符串操作方法实例
- Android中Fragment+ViewPager的配合使用
- 结合机器学习与生物医学技术,寻找Uber司机出行模式
- ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
- LVS+Keepalived高可用环境部署梳理(主主和主从模式)
- 随着区块链的火爆,相关顶级域名“矿池”KC.com已建站
- Flash/Flex学习笔记(50):3D线条与填充
- LVM常规操作记录梳理(扩容/缩容/快照等)
- Flash/Flex学习笔记(55):背面剔除与 3D 灯光
- 资源等待类型sys.dm_os_wait_stats
- NVIDIA不再允许数据中心用GeForce驱动,提供区块链服务除外
- 非常强悍并实用的双机热备+负载均衡线上方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PAT (Advanced Level) Practice 1024 Palindromic Number (25 分)
- Flink 连接 hive 解决 java.net.UnknownHostException
- PAT (Advanced Level) Practice 1147 Heaps (30 分)
- Java自动化测试(app自动化环境搭建 31)
- PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
- 数据结构题集(严书)串 常见习题代码
- PAT (Basic Level) Practice (中文)1040 有几个PAT (25 分)
- 201909-4ccf计算机职业资格认证考试 第四题 推荐系统
- 【Linux_Shell 脚本编程学习笔记四、监控系统内存并报警企业案例脚本】
- PAT (Basic Level) Practice (中文)1042 字符统计 (20 分)
- Pytorch 中的 5 个非常有用的张量操作
- k-近邻算法实现数字识别
- 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚本】
- vue中子组件使用$emit传值的种种情况
- 前端工程化建设