注解和反射
注解
什么是注解
Annotation是JDK5.0开始引入的新技术
Annotation的作用
- 不是程序本身,可以对程序作出解释(这一点和注释没有什么区别)
- 可以被其他程序读取
Annotation的格式
注解是以“@注释名”在代码中存在的,还可以加一些参数值例如:@SuppressWarnings(value = “unchecked”)
注解在哪里使用
可以附加在packet,class,method,filed等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素数据的访问。
自定义注解
- @interface用来声明一个注解,格式public@interface注解名{定义内容}
- 其中每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值的类型就是参数的类型(返回值只能是基本类型,Class,String,enum)
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,我们定义注解元素是,经常使用空字符串,0作为默认值
反射
什么是反射
Reflection(反射)是Java中被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
加载完类之后,堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过镜子可以看到类的结构,所以,我们形象的称之为:反射。
反射的优点和缺点
优点:
可以实现动态的穿件对象和编译,体现出很大的灵活性
缺点:
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且他满足我们的要求。这类操作总是慢与直接执行相同的操作。
反射相关的主要API
- java.lang.Class:代表一个类
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造器
那些类型可以有Class对象
- class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类。
- interface:接口
- []:数组
- enum:枚举
- annotation:注解@interface
- primitive type:基本数据类型
- void
什么时候会发生类的初始化
- 类的主动引用(一定会发生类的初始化)
- 当虚拟机启动,先初始化main方法所在的类
- new 一个类的对象
- 调用类的静态成员变量(出了Final)和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
- 当初始化一个类,如果其父类没有被初始化,则先回初始化他的父类
- 类的被动引用
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类的初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
获取运行时类的完整结构
Field, Method, Constructor, Superclass, Interface, Annotation
包括:
- 实现类的全部接口
- 所继承的父类
- 全部的构造器
- 全部的方法
- 全部的Field
- 注解
- 。。。
汇编
概述
学习路线:
语言
进制
进制如何运算
二进制
数据宽度
有符号数和无符号数
原码反码补码
位运算
位运算计算
汇编
寄存器
内存
汇编指令
内存复制
堆栈的指令
汇编如何写函数
堆栈传参
堆栈平衡
外挂