1.类的加载:
1)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
---加载
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象
---连接
验证:是否有正确的内部结构,并和其他类协调一致. 确保Class文件中包含的信息符合当前虚拟机的要求.比如,校验某非抽象类是否实现了抽象父类的全部方法.方法体中 类型转换 符号是否有效等.
准备:负责为类的静态成员分配内存,并设置默认初始化值
解析:将类的二进制数据中的符号引用替换为直接引用
---初始化
对类的静态内容执行初始化操作
2.反射:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
简而言之,反射就是:在运行时通过代码操作Class
反射
通过反射可以获取到一个类的构造方法,成员方法成员变量 并运行
反射将一个类的各个部分映射成相应的类
反射获取构造方法
Class类中方法
Constructor>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法
Constructor
参数
Constructor 用来描述构造方法的类 返回回来的就是Constructor的对象
* Class>... parameterTypes 可变参数 是构造方法参数类型 如果参数不写 则返回空参构造方法
Constructor
T newInstance(Object... initargs) 运行构造方法创建对象
返回值T 是泛型 没有泛型就是Object类型
参数 为构造方法要使用的实际参数 参数不写则运行的是空参构造方法
1.获取字节码文件对象
2.通过字节码文件对象获取构造方法对象
3.通过构造方法对象调用方法运行构造方法
反射获取对象的快捷方式
Class类的方法
T newInstance() 创建此 Class 对象所表示的类的一个新实例。
前提 必须有空参构造 空参构造必须public修饰
1.获取字节码文件对象
2.通过字节码文件直接调用newInstance创建对象
反射获取成员变量(因为成员变量都是私有的,所以用的很少)(了解)
Class类中方法
Field getField(String name) 返回指定变量名的成员变量
Field[] getFields() 返回所有public修饰的成员变量
Field类中的方法
void set(Object obj, Object value) 为指定对象的成员变量赋值 obj为要赋值的对象 value为要赋的值
1.获取字节码文件对象
2.通过字节码文件对象获取字段对象
3.调用set方法为字段赋值 注意 需要给定一个对象 可以通过快捷方式反射创建
反射获取成员方法
Class类中方法
Method[] getMethods() 获取所有公共方法
Method getMethod(String name, Class>... parameterTypes) 获取指定方法名的公共方法
name 方法名
Class>... parameterTypes 可变参 方法需要的参数类型 如果不写为空参方法
Method类中方法
Object invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 所表示的方法
obj 要运行哪个对象的方法
args 方法的实际参数
1.获取字节码文件对象
2.通过字节码文件对象获取方法对象
3.调用invoke方法运行当前方法 注意 需要给定一个对象 可以通过快捷方式反射创建
3.注解和xml:
xml:
1)xml:XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML 被设计用来传输和存储数据。
2)XML文档声明格式:
文档声明必须为结束;
文档声明必须从文档的0行0列位置开始;
文档声明只有2个属性:
version:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8;
3)xml约束:
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
常见的xml约束:DTD、Schema
目的: 通过约束文档,可以编写出符合约束格式的XML文档.
4.xml解析:
1)发中比较常见的解析方式有三种,如下:
小结:
XML
可扩展的标记语言
作用
1.存放数据
2.配置文件
语法
文档声明
1.文档声明必须为结束;
2.文档声明必须从文档的0行0列位置开始;
3.文档声明只有2个属性:
version 版本
encoding 编码
元素
1.必须开始结束
2.标签由开始标签,元素体、结束标签组成
3.元素体 可以是文本 也可以是标签你好
4.空元素
5.元素命名 区分大小写 不用特殊符号 不要xml开头
6.必须有根元素
属性
1.出现在开始标签
2.属性名="属性值"
3.一个元素多个属性不可相同
4.属性名无特殊符号 字母开头
注释
转义字符(不用记)
< <
> >
" "
' '
& &
CDATA
纯文本
]]>
DTD
引用DTD
本地dtd
公共dtd
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
元素声明(了解)
? 0-1次
* 任意次
+ 至少1次
() 分组
| 或
, 顺序
属性声明(了解)
属性的语法:(attribute)
属性名 属性类型 约束
属性名 属性类型 约束
...
>
元素名:属性必须是给元素添加,所有必须先确定元素名
属性名:自定义
属性类型:ID、CDATA、枚举…
ID : ID类型的属性用来标识元素的唯一性
CDATA:文本类型
约束:
#REQUIRED:说明属性是必须的;required
#IMPLIED:说明属性是可选的;implied
能根据约束写标签即可
Schema
引用Schema
xsi:schemaLocation="http://www.baidu.com/bean bean-schema.xsd"
>
能根据约束写标签即可
xml解析
DOM解析原理
将xml加载进内存 形成DOM树 并得到一个document对象
dom4j
常用API如下:
1.SaxReader对象
a)read(…) 加载执行xml文档
2.Document对象
a)getRootElement() 获得根元素
3.Element对象
a)elements(…) 获得指定名称的所有子元素。可以不指定名称
b)element(…) 获得指定名称第一个子元素。可以不指定名称
c)getName() 获得当前元素的元素名
d)attributeValue(…) 获得指定属性名的属性值
e)elementText(…) 获得指定名称子元素的文本值
f)getText() 获得当前元素的文本内容
---注解---
1)什么是注解:Annotation注解,是一种代码级别的说明。一个特性,与类、接口、枚举是在同一个层次。
2)注解的作用:
*编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。
*代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。
*编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容
3)自定义注解:
*定义类: class 定义接口:interface 定义枚举:enum
*自定义注解语法:
定义注解使用关键字: @interface
// #定义注解
@interface MyAnno1{
}
//#2 定义含有属性的注解
@interface MyAnno2{
public String username() default "jack";
}
*属性格式:修饰符 返回值类型 属性名() [default 默认值]
*使用格式:@注解类名( 属性名= 值 , 属性名 = 值 , .....)@MyAnno_2(username="rose")
*自定义注解解析:
JDK提供java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。
*元注解:
元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
JDK提供4种元注解:
@Retention 用于确定被修饰的自定义注解生命周期。
@Target 用于确定自定义注解被使用的位置。
-1.ElementType.TYPE 修饰类、接口。
-2.ElementType.CONSTRUCTOR 修饰构造。
-3.ElementType.METHOD 修饰方法。
-4.ElementType.FILED 修饰字段。